A - New Year and Hurry (water)
#include <bits/stdc++.h> using namespace std; int main() { ]; ; i <= ; i++) { a[i] = ( + i) * i / * ; } int n ,k; while(~scanf("%d%d", &n, &k)) { ; ; i <= n; i++) { - k >= a[i]) ans = i; } printf("%d\n", ans); } ; }
B - New Year and North Pole(water)
题意:往东南西北走,最后一定要到达北极,走的方式有限制。注意坑点。
#include <bits/stdc++.h> using namespace std; ; int main() { int n; while(~scanf("%d", &n)) { , ok = ; ; i < n; i++) { ]; int dis; scanf("%d%s", &dis, dir); ] == 'S') { if(cur == con || dis > con || cur + dis > con) { ok = ; } cur += dis; } ] == 'N') { || dis > con || cur - dis < ) { ok = ; } cur -= dis; } else { || cur == con) ok = ; } } ) ok = ; if(ok) { printf("YES\n"); } else { printf("NO\n"); } } ; }
C - New Year and Rating(脑洞?思维?)
题意:给你一系列比赛的分数变化值和参加的级别,问你参加完这些比赛后,你的最大rating是多少。
思路:
感觉自己想复杂了,写的又臭又长还错,其实就是维护一个最大值,一个最小值,代表参加这些比赛之前你的rating初始值的范围,然后不断更新这个范围就行了。
阿西吧,想到了维护最大最小值,但是没有用前缀和来做,你会发现每场比赛的时候无非是,rating + sum[i - 1] >= 1900,或者,rating + sum[i - 1] <= 1899两种状态,这么水的题,相岔了= =。
#include <bits/stdc++.h> using namespace std; + ; const int INF = 0x3f3f3f3f; int sum[maxn]; int main() { int n; while(~scanf("%d", &n)) { sum[] = ; ; ; i <= n; i++) { int c, d; scanf("%d%d", &c, &d); sum[i] = sum[i - ] + c; ) {//rating + sum[i-1] >= 1900 minn = max(minn, - sum[i - ]); } ) {//rating + sum[i-1] <= 1899 maxx = min(maxx, - sum[i - ]); } ; } ) { if(maxx != INF) { printf("%d\n", maxx + sum[n]); } else { printf("Infinity\n"); } } else { printf("Impossible\n"); } } ; }
D - New Year and Fireworks(分形)
题意:
思路:
我觉得这题挺好的,练练分形的思想,递归的写法,听完思路,发现自己实现无能,有点懵。然后推一个数学里头的沿直线对称,得到对应坐标点就行了。
关于(i,j)点关于直线y=f(x), y=g(x)对称的点(x',y'),初中不是学过嘛,x' = g(j),y' = f(i)。不知道这个结论的话....初中数学的知识也够推的,过(i,j)做一条垂直于y=f(x)的直线,然后求交点,然后根据交点和(i,j)得到对称点。
其实这题可以直接暴力模拟,不需要分形的去考虑。不过我还是想练练分形的写法,补一下。
#include <bits/stdc++.h> using namespace std; ; ], n; ][maxn][maxn]; , }; , }; void map_reverse(int pax, int pay, int dir, int cur) { ; i < maxn; i++) { ; j < maxn; j++) { ][i][j]) { ma[cur][i][j] = true; ) ma[cur][j + (pax - pay)][i - (pax - pay)] = true; ) ma[cur][ * pax - i][j] = true; } } } } void f(int pax, int pay, int dir, int cur) { if(cur != n) { f(pax + dx[dir] * (t[cur] - ) + dx[dir ^ ], pay + dy[dir] * (t[cur] - ) + dy[dir ^ ], dir ^ , cur + ); map_reverse(pax, pay, dir, cur); } ; i < t[cur]; i++) { ma[cur][pax + dx[dir] * i][pay + dy[dir] * i] = true; } } int main() { scanf("%d", &n); ; i <= n; i++) { scanf("%d", &t[i]); } f(maxn / , maxn / , , ); ; ; i < maxn; i++) { ; j < maxn; j++) { ][i][j]) cnt++; } } printf("%d\n", cnt); ; }