只看了前面三题,都很水。但是做的很不好。
A.Sockets 题目确实挺晦涩的,但是勉强看着Sample就一下懂了,按照给的supply-line filter排个序,然后由大到小累积,看需要几个能满足所有Devices,如果不行就 -1
#include <iostream> #include <cstdlib> #include <cstdio> #include <cstring> #include <string> #include <algorithm> #include <cmath> #include <vector> #include <map> #include <list> #include <deque> #include <queue> #include <functional> #include <bitset> #include <set> using namespace std; int e[55]; int main() { int n,m,k,i; cin >> n >> m >> k; for(i = 0; i < n; i++) cin >> e[i]; sort(e, e+n); int ok = 0; int ans = 0; int cur = k; if(cur >= m) ok = 1; for(i = n-1; i >= 0 && !ok; i--) { cur = cur-1 + e[i]; ans++; if(cur >= m) { ok = 1; break; } } if(ok) cout << ans << endl; else cout << "-1" << endl; return 0; }
B.Playing Cubes Petya第一个方块放的颜色决定方块的排列。可以模拟放方块的过程来得到结果。答案为 max(red, blue)-1, min(red, blue)
C.View Angle
从原点(0,0)出发的的n条射线,求最小角度包含所有射线。
可以用atan2()函数。
对于任意不同时等于0的实参数x和y,atan2(y,x)所表达的意思是坐标原点为起点,指向(x,y)的射线在坐标平面上与x轴正方向之间的角的角度度。当y>0时,射线与x轴正方向的所得的角的角度指的是x轴正方向绕逆时针方向到达射线旋转的角的角度;而当y<0时,射线与x轴正方向所得的角的角度指的是x轴正方向绕顺时针方向达到射线旋转的角的角度。
当弧度值小于0时候,加上2*M_PI,修正成从0开始。
将这些射线按照弧度值升序,然后依次枚举相邻两个射线的角度,别忘了处理首尾两个射线,最后用360.0 - 枚举出最大的相邻射线弧度,乘以180.0/M_PI,就是答案。
#define _CRT_SECURE_NO_WARNINGS #define _USE_MATH_DEFINES #include <iostream> #include <cstdlib> #include <cstdio> #include <cstring> #include <string> #include <algorithm> #include <cmath> #include <cassert> #include <vector> #include <map> #include <list> #include <deque> #include <queue> #include <functional> #include <bitset> #include <set> using namespace std; vector<double> e; int main() { int n,i; double x,y; cin >> n; for(i = 0; i < n; i++) { scanf("%lf %lf", &x,&y); double tmp = atan2(y,x); if(tmp < 0) e.push_back(2*M_PI+tmp); else e.push_back(tmp); } sort(e.begin(), e.end()); double dif = 0.0; for(i = 1; i < e.size(); i++) dif = max(dif, e[i]-e[i-1]); dif = max(dif, 2*M_PI - (e[n-1]-e[0])); printf("%.10lf\n", 360.0 - dif*180.0/M_PI); return 0; }
D.Sum
自己YY了,结果过了。因为满足ai ≤ ai+1 ≤ 2ai-1 ,所以有个想法,设定一个变量mend = 0作为修正变量,从尾到头不断根据mend变量来调整取正还是取负。
但是遇到3 3 5这种,从尾到头mend最后为-1,那么就把正负号颠倒过来好了。看到Tag有DP,不知道该怎么想,求各位大牛指导。
#define _CRT_SECURE_NO_WARNINGS #include <cstdio> #include <cstring> #include <algorithm> #include <iostream> #include <sstream> #include <iomanip> #include <vector> #include <deque> #include <list> #include <set> #include <map> #include <stack> #include <queue> #include <bitset> #include <string> #include <numeric> #include <functional> #include <iterator> #include <typeinfo> #include <utility> #include <memory> #include <cmath> #include <cstdlib> #include <cctype> #include <cstddef> #include <complex> #include <ctime> #include <cassert> using namespace std; static inline bool get(int &v) { int s = 1, c; while(!isdigit(c = getchar())&&c != '-') { if(c == EOF) break ; } if(c == EOF) return 0; if(c == '-') s = 0 , v = 0; else v = c^48; for(;isdigit(c = getchar());v = (v << 1) + (v << 3) + (c ^ 48)); v = (s ? v : -v); return 1 ; } vector<int> e; char ans[100005]; int main() { int n,i,tmp; get(n); for(i = 0;i < n; i++) { get(tmp); e.push_back(tmp); } int mend = 0; for(i = n-1; i >= 0; i--) { if(mend > 0) { mend -= e[i]; ans[i] = '-'; } else { mend += e[i]; ans[i] = '+'; } } if(mend < 0) { for(i = 0; i < n; i++) { if(ans[i] == '+') printf("-"); else printf("+"); } } else { for(i = 0; i < n; i++) { printf("%c", ans[i]); } } printf("\n"); return 0; }
E.Greedy Elevator