首页 > 代码库 > 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 }
View Code

 

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 }
View Code

 

 

 

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 }
View Code

 

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 }
View Code

 

Good Bye 2016