第二十次CCF计算机软件能力认证

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<ll, ll> P;
bool cmp(P a, P b) {
	if(a.first == b.first) {
		return a.second < b.second;
	}
	return a.first < b.first;
}
int main () {
	vector<P> v; 
	ll n, x, y;
	cin >> n >> x >> y;
	for(int i = 0; i < n; ++i) {
		ll a, b;
		cin >> a >> b;
		ll dis = (x - a) * (x - a) + (y - b) * (y - b);
		v.push_back(P(dis, i + 1));
	}
	sort(v.begin(), v.end(), cmp);
	for(int i = 0; i < 3; ++i) {
		cout << v[i].second << endl;
	}
}

 

#include <bits/stdc++.h>
using namespace std;

int main () {
	int jingguo = 0;
	int douliu = 0;
	int n, k, t, xl, yd, xr, yu;
	cin >> n >> k >> t >> xl >> yd >> xr >> yu;
	while(n--) {
		int x, y;
		bool isjingguo = 0;
		int temp = 0;
		int maxx = -1;
		for(int i = 0; i < t; ++i) {
			cin >> x >> y;
			if(x >= xl && x <= xr && y >= yd  && y <= yu) {
				isjingguo = 1;
				temp++;
			}
			else {
				temp = 0;
			}
			maxx = max(temp, maxx);
		}
		if(maxx >= k) {
			douliu++;
		}
		if(isjingguo) {
			jingguo++;
		}
	}	
	cout << jingguo << endl;
	cout << douliu << endl;
}

 

 

 

 记忆化DFS+拓扑排序判环

#include <bits/stdc++.h>
using namespace std;
typedef struct
{
	std::vector<string> op_item;
	string op;
	int in;
	int out;
}Yuanjian;
typedef struct
{	
	int op_num;
	std::vector<int> input;
	std::vector<int> output;
}Guapi;
typedef struct
{
	std::vector<int> mubiao;
}Topoint;
Topoint topoint[505];
Yuanjian nb[505];
int save[505];
std::vector<int> input;
int getNum(string op_item) {
	int num = 0;
	int quan = 1;
	for(int i = op_item.size() - 1; i > 0; --i) {
		num += (op_item[i] - '0') * quan;
		quan *= 10;
	}
	return num;
}
bool getAns(Yuanjian temp) {

	string op = temp.op;
	if(op == "NOT") {
		bool op_num;
		if(temp.op_item[0][0] == 'O') {
			if(save[getNum(temp.op_item[0])] == -1) {
				save[getNum(temp.op_item[0])] = getAns(nb[getNum(temp.op_item[0])]);
			}
			op_num = save[getNum(temp.op_item[0])] ;
		} else {
			op_num = input[getNum(temp.op_item[0])];
		}
		return !op_num;
	}
	vector<bool> op_num(temp.op_item.size());
	for(int i = 0; i < int(op_num.size()); ++i) {
		if(temp.op_item[i][0] == 'O') {
			if(save[getNum(temp.op_item[i])] == -1) {
				save[getNum(temp.op_item[i])] = getAns(nb[getNum(temp.op_item[i])]);
			}
			op_num[i] = save[getNum(temp.op_item[i])];
		} else {
			op_num[i] = input[getNum(temp.op_item[i])];
		}			
	}
	if(op == "AND") {
		bool ans = op_num[0];
		for(int i = 1; i < int(op_num.size()); ++i) {
			ans &= op_num[i];
		}
		return ans;
	}
	if(op == "OR") {
		bool ans = op_num[0];
		for(int i = 1; i < int(op_num.size()); ++i) {
			ans |= op_num[i];
		}
		return ans;
	}
	if(op == "XOR") {
		bool ans = op_num[0];
		for(int i = 1; i < int(op_num.size()); ++i) {
			ans ^= op_num[i];
		}
		return ans;
	}
	if(op == "NAND") {
		bool ans = op_num[0];
		for(int i = 1; i < int(op_num.size()); ++i) {
			ans &= op_num[i];
		}
		return !ans;
	}
	if(op == "NOR") {
		bool ans = op_num[0];
		for(int i = 1; i < int(op_num.size()); ++i) {
			ans |= op_num[i];
		}
		return !ans;
	}
	return 0;
}
bool topSort(int N) {
	queue<int> q;
	for(int i = 1; i <= N; ++i) {
		if(nb[i].in == 0) {
			q.push(i);
		}
	}
	std::vector<int> ans;
	while(!q.empty()) {
		int p = q.front();
		q.pop();
		ans.push_back(p);
		for(int i = 0; i < topoint[p].mubiao.size(); ++i) {
			int temp = topoint[p].mubiao[i];
			nb[temp].in--;
			if(nb[temp].in == 0) {
				q.push(temp);
			}
		}
	}
	if(ans.size() != N) {
		return 1;
	} else {
		return 0;
	}
}
int main () {
	ios::sync_with_stdio(false);
	cin.tie(0);
	int Q;
	cin >> Q;
	while(Q--) {
	//	Final final[10005];
		int M, N;
		cin >> M >> N;
		for(int i = 1; i <= N; ++i) {
			topoint[i].mubiao.clear();
			nb[i].in = 0;
			nb[i].out = 0;
		}
		bool isOK = 0;
		for(int i = 1; i <= N; ++i) {
			cin >> nb[i].op;
			int num;
			cin >> num;
			nb[i].op_item.resize(num);
			for(int j = 0; j < num; ++j) {
				int first_num = i;
				cin >> nb[i].op_item[j];
				int second_num = getNum(nb[i].op_item[j]);
				if(nb[i].op_item[j][0] == 'O' && first_num == second_num) {
					isOK = 1;
					continue;
				}
				if(nb[i].op_item[j][0] == 'O') {
					
					nb[first_num].in++;
					nb[second_num].out++;
					topoint[second_num].mubiao.push_back(first_num); 			
				}
			}
		}
		if(!isOK && topSort(N)) {
			isOK = 1;
		}
		int S;
		cin >> S;
		std::vector<Guapi> guapi;
		guapi.resize(S);
		for(int i = 0; i < S; ++i) {
			guapi[i].input.resize(M + 1);
			for(int j = 1; j <= M; ++j) {
				cin >> guapi[i].input[j];
			}
		}
		for(int i = 0; i < S; ++i) {
			cin >> guapi[i].op_num;
			for(int j = 0; j < guapi[i].op_num; ++j) {
				int temp;
				cin >> temp;
				guapi[i].output.push_back(temp);
			}
		}
		if(isOK) {
			cout << "LOOP" << endl;
			continue;
		}
		for(int i = 0; i < S; ++i) {
			std::vector<bool> ans;
			input = guapi[i].input;
			memset(save, -1, sizeof save);
			for(int j = 0; j < guapi[i].output.size(); ++j) {
				if(save[guapi[i].output[j]] == -1) {
					save[guapi[i].output[j]] = getAns(nb[guapi[i].output[j]]);
				}
				cout << save[guapi[i].output[j]] << " ";
			}
			cout << endl;
		}
	}
	return 0;
}

 

 根据a和b+c的关系分成两种情况,剩下情况都是两个线段加上一段圆弧

 两个线段:由勾股定理求解。

 一段圆弧:先由余弦定理求出两点与到圆心直线夹角,然后由几何关系做差得到圆弧对应圆心角,乘以半径后得到弧长。

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
double getDis(std::vector<ll> p1, std::vector<ll> p2) {
	ll ans = 0ll;
	for(int i = 0; i < p1.size(); ++i) {
		ans += (p1[i] - p2[i]) * (p1[i] - p2[i]);
	}
	return sqrt(ans);
}
int main () {
	double yuchuliDian[2002];
	double ans[2002];
	memset(ans, 0.0, sizeof ans);
	memset(yuchuliDian, 0.0, sizeof yuchuliDian);
	int n, m;
	scanf("%d%d", &n, &m);
	ll r;
	scanf("%lld", &r);
	std::vector<std::vector<ll> > point(m, std::vector<ll> (n));
	std::vector<ll> xin;
	for(int i = 0; i < n; ++i) {
		ll temp;
		scanf("%lld", &temp);	
		xin.push_back(temp);	
	}

	for(int i = 0; i < m; ++i) {
		for(int j = 0; j < n; ++j) {
			scanf("%lld", &point[i][j]);
		}
	}
	for(int i = 0; i < m; ++i) {
		for(int j = i + 1; j < m; ++j) {
			if(yuchuliDian[i] == 0.0) {
				yuchuliDian[i] = getDis(point[i], xin);
			}
			if(yuchuliDian[j] == 0.0) {
				yuchuliDian[j] = getDis(point[j], xin);
			}
			double io = yuchuliDian[i];
			double jo = yuchuliDian[j];
			double ij = getDis(point[i], point[j]);
			double jiaoi = acos(double(r) / io);
			double jiaoj = acos(double(r) / jo);
			double jiaoioj = acos((io * io + jo * jo - ij * ij) / (2.0 * io * jo));
			if(jiaoioj > jiaoi + jiaoj) {
				double jiao = jiaoioj - jiaoi - jiaoj;
				ans[i] += jiao * double(r) + sqrt(io * io - double(r * r)) + sqrt(jo * jo - double(r * r));
				ans[j] += jiao * double(r) + sqrt(io * io - double(r * r)) + sqrt(jo * jo - double(r * r));
			} else {
				ans[i] += ij;
				ans[j] += ij;
			}
		}
	}
	for(int i = 0; i < m; ++i) {
		printf("%.14lf
", ans[i]);
	}
	return 0;
}
原文地址:https://www.cnblogs.com/lightac/p/14016595.html