首页 > 代码库 > Good Bye 2016
Good Bye 2016
A - New Year and Hurry (water)
1 #include <bits/stdc++.h> 2 using namespace std; 3 int main() 4 { 5 int a[100]; 6 for(int i = 1; i <= 10; i++) 7 { 8 a[i] = (1 + i) * i / 2 * 5; 9 } 10 int n ,k; 11 while(~scanf("%d%d", &n, &k)) 12 { 13 int ans = 0; 14 for(int i = 1; i <= n; i++) 15 { 16 if(240 - k >= a[i]) ans = i; 17 } 18 printf("%d\n", ans); 19 } 20 return 0; 21 }
B - New Year and North Pole(water)
题意:往东南西北走,最后一定要到达北极,走的方式有限制。注意坑点。
1 #include <bits/stdc++.h> 2 using namespace std; 3 const int con = 20000; 4 int main() 5 { 6 int n; 7 while(~scanf("%d", &n)) 8 { 9 int cur = 0, ok = 1; 10 for(int i = 0; i < n; i++) 11 { 12 char dir[10]; 13 int dis; 14 scanf("%d%s", &dis, dir); 15 if(dir[0] == ‘S‘) 16 { 17 if(cur == con || dis > con || cur + dis > con) 18 { 19 ok = 0; 20 } 21 cur += dis; 22 } 23 else if(dir[0] == ‘N‘) 24 { 25 if(cur == 0 || dis > con || cur - dis < 0) 26 { 27 ok = 0; 28 } 29 cur -= dis; 30 } 31 else 32 { 33 if(cur == 0 || cur == con) ok = 0; 34 } 35 } 36 if(cur != 0) ok = 0; 37 if(ok) 38 { 39 printf("YES\n"); 40 } 41 else 42 { 43 printf("NO\n"); 44 } 45 } 46 return 0; 47 }
C - New Year and Rating(脑洞?思维?)
题意:给你一系列比赛的分数变化值和参加的级别,问你参加完这些比赛后,你的最大rating是多少。
思路:
感觉自己想复杂了,写的又臭又长还错,其实就是维护一个最大值,一个最小值,代表参加这些比赛之前你的rating初始值的范围,然后不断更新这个范围就行了。
阿西吧,想到了维护最大最小值,但是没有用前缀和来做,你会发现每场比赛的时候无非是,rating + sum[i - 1] >= 1900,或者,rating + sum[i - 1] <= 1899两种状态,这么水的题,相岔了= =。
1 #include <bits/stdc++.h> 2 using namespace std; 3 const int maxn = 200000 + 5; 4 const int INF = 0x3f3f3f3f; 5 int sum[maxn]; 6 int main() 7 { 8 int n; 9 while(~scanf("%d", &n)) 10 { 11 sum[0] = 0; 12 int maxx = INF, minn = -INF, ok = 1; 13 for(int i = 1; i <= n; i++) 14 { 15 int c, d; 16 scanf("%d%d", &c, &d); 17 sum[i] = sum[i - 1] + c; 18 if(d == 1) 19 {//rating + sum[i-1] >= 1900 20 minn = max(minn, 1900 - sum[i - 1]); 21 } 22 else if(d == 2) 23 {//rating + sum[i-1] <= 1899 24 maxx = min(maxx, 1899 - sum[i - 1]); 25 } 26 if(maxx < minn) ok = 0; 27 } 28 if(ok == 1) 29 { 30 if(maxx != INF) 31 { 32 printf("%d\n", maxx + sum[n]); 33 } 34 else 35 { 36 printf("Infinity\n"); 37 } 38 } 39 else 40 { 41 printf("Impossible\n"); 42 } 43 } 44 return 0; 45 }
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)得到对称点。
其实这题可以直接暴力模拟,不需要分形的去考虑。不过我还是想练练分形的写法,补一下。
1 #include <bits/stdc++.h> 2 using namespace std; 3 const int maxn = 405; 4 int t[35], n; 5 bool ma[35][maxn][maxn]; 6 int dx[] = {0, 1}; 7 int dy[] = {1, 1}; 8 9 void map_reverse(int pax, int pay, int dir, int cur) 10 { 11 for(int i = 0; i < maxn; i++) 12 { 13 for(int j = 0; j < maxn; j++) 14 { 15 if(ma[cur + 1][i][j]) 16 { 17 ma[cur][i][j] = true; 18 if(dir == 1) 19 ma[cur][j + (pax - pay)][i - (pax - pay)] = true; 20 else if(dir == 0) 21 ma[cur][2 * pax - i][j] = true; 22 } 23 } 24 } 25 } 26 27 void f(int pax, int pay, int dir, int cur) 28 { 29 if(cur != n) 30 { 31 f(pax + dx[dir] * (t[cur] - 1) + dx[dir ^ 1], pay + dy[dir] * (t[cur] - 1) + dy[dir ^ 1], dir ^ 1, cur + 1); 32 map_reverse(pax, pay, dir, cur); 33 } 34 35 for(int i = 0; i < t[cur]; i++) 36 { 37 ma[cur][pax + dx[dir] * i][pay + dy[dir] * i] = true; 38 } 39 } 40 41 int main() 42 { 43 scanf("%d", &n); 44 for(int i = 1; i <= n; i++) 45 { 46 scanf("%d", &t[i]); 47 } 48 f(maxn / 2, maxn / 2, 0, 1); 49 int cnt = 0; 50 for(int i = 0; i < maxn; i++) 51 { 52 for(int j = 0; j < maxn; j++) 53 { 54 if(ma[1][i][j]) 55 cnt++; 56 } 57 } 58 printf("%d\n", cnt); 59 return 0; 60 }
Good Bye 2016
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。