快一年没有做题了, 今天跟了一下 GCJ Round 1A的题目, 感觉难度偏简单了, 很快搞定了第一题, 第二题二分稍微考了一下, 还剩下一个多小时, 没仔细想第三题, 以为 前两个题目差不多可以晋级了. 切出去玩了一会, 大概剩半小时, 发现自己的排名逐渐快超 1k了, 果断决定搞出第三题的小数据. 然后简单的O(n^3)的枚举过了. 然后有惊无险的晋级了.
第一题,读懂题目,然后计算就很好说了. 第二题,计算最小公倍数的那种肯定是行不通的, 二分 t时刻 已经剪完了多少个, 正在剪的有多少个, 然后准备剪的有多少个, 然后二分.
第三题, 其实当时已经想到了解决思路, 去掉点然后没有凸包就意味着极角排序之后, 删掉多少个中间元素, 可以让某两个极角序列的interval 大于 Pi. 复杂度就是 O(n^2lgn) nlgn是极角排序负责度, n是枚举每一个需要处理的点.
1: #include <bits/stdc++.h>2: using namespace std;
3: 4: int n;
5: double x[3001], y[3001];
6: double pi = atan(1) * 4;
7: 8: int solve(vector <double> lis)
9: {10: if(n == 1)
11: return 0;
12: lis.push_back(100);13: int p = 0;
14: int ret = 1000000;
15: for(int i = 0; i < n; i++)
16: {17: while(lis[p+1] <= lis[i] + pi - 1e-8)
18: p ++; 19: ret = min(ret, p - i); 20: }21: return ret;
22: } 23: 24: void solve()
25: { 26: cin >> n; 27: cout << endl;28: for(int i = 1; i <= n; i++)
29: { 30: cin >> x[i] >> y[i]; 31: }32: for(int i = 1; i <= n; i++)
33: {34: vector <double> dir;
35: for(int j = 1; j <= n; j++)
36: if(i != j)
37: {38: double v = atan2(y[j] - y[i], x[j] - x[i]);
39: dir.push_back(v); 40: dir.push_back(v + 2 * pi); 41: } 42: sort(dir.begin(), dir.end()); 43: cout << solve(dir) << endl; 44: } 45: }
![RHW$Q]1Q{@7JG{XUC]}_`MT RHW$Q]1Q{@7JG{XUC]}_`MT](http://images0.cnblogs.com/blog/282331/201504/181356230269074.png)
浙公网安备 33010602011771号