2019 ECNU Campus Invitational Contest

51假期无聊就跟队友一起训练了。队友手感挺好的,反而我不是很在状态。

把简单的题都切了,剩下的都是通过人数个位数的神仙题。

题目链接:http://codeforces.com/gym/102190


 A:

签到题。根据长度暴力塞进去就好了。

 1 /* basic header */
 2 #include <iostream>
 3 #include <cstdio>
 4 #include <cstdlib>
 5 #include <string>
 6 #include <cstring>
 7 #include <cmath>
 8 #include <cstdint>
 9 #include <climits>
10 #include <float.h>
11 /* STL */
12 #include <vector>
13 #include <set>
14 #include <map>
15 #include <queue>
16 #include <stack>
17 #include <algorithm>
18 #include <array>
19 #include <iterator>
20 /* define */
21 #define ll long long
22 #define dou double
23 #define pb emplace_back
24 #define mp make_pair
25 #define fir first
26 #define sec second
27 #define sot(a,b) sort(a+1,a+1+b)
28 #define rep1(i,a,b) for(int i=a;i<=b;++i)
29 #define rep0(i,a,b) for(int i=a;i<b;++i)
30 #define repa(i,a) for(auto &i:a)
31 #define eps 1e-8
32 #define int_inf 0x3f3f3f3f
33 #define ll_inf 0x7f7f7f7f7f7f7f7f
34 #define lson curPos<<1
35 #define rson curPos<<1|1
36 /* namespace */
37 using namespace std;
38 /* header end */
39 
40 const int maxn = 10;
41 char s[maxn];
42 
43 int main()
44 {
45     scanf("%s", s + 1);
46     int len = strlen(s + 1);
47     int sh = 0, th = 0, day;
48     if (len == 3)
49     {
50         sh = s[1] - '0'; th = 12 + s[2] - '0'; day = s[3] - '0';
51     }
52     else if (len == 5)
53     {
54         sh = (s[1] - '0') * 10 + s[2] - '0';
55         th = 12 + (s[3] - '0') * 10 + s[4] - '0';
56         day = s[5] - '0';
57     }
58     else
59     {
60         sh = (s[1] - '0') * 10 + s[2] - '0';
61         th = 12 + s[3] - '0';
62         day = s[4] - '0';
63         if ((sh < 2 || sh > 11) || (th < 14 || th > 23))
64         {
65             sh = s[1] - '0';
66             th = 12 + (s[2] - '0') * 10 + s[3] - '0';
67         }
68     }
69     printf("%d\n", day * (th - sh));
70     return 0;
71 }
View Code

B:

概率dp。

 1 #include <cstdio>
 2 
 3 char A[1000002], B[1000002];
 4 double f[1000002], p[1000002];
 5 
 6 int main(void)
 7 {
 8     int T;
 9     scanf("%d", &T);
10     f[0] = 0; // joker in my hand.
11     p[0] = 1; // joker in opp's hand.
12     for (int i = 1; i <= 1000000; i++)
13     {
14         // 我赢的概率 = 1 - 对手在下一个状态下赢的概率
15         f[i] = 1.0 - p[i - 1]; // 我一定会抽到一张好牌;
16         //p[i] = 1.0 / (i + 1) * (1 - p[i]) // 我抽到了对面的鬼牌。
17         //  + 1.0 * i / (i + 1) * (1 - f[i - 1]); // 我抽到了对面的好牌。
18         p[i] = (1.0 + i - 1.0 * i * f[i - 1]) / (i + 2);
19     }
20     while (T--)
21     {
22         int n;
23         scanf("%d", &n);
24         scanf(" %s", A);
25         scanf(" %s", B);
26         int cnt = 0;
27         bool myjoker = false;
28         for (int i = 0; i < n; i++)
29         {
30             if (A[i] == '1' && B[i] == '1')
31             {
32                 cnt++;
33             }
34             else if (A[i] == '1')
35             {
36                 myjoker = true;
37             }
38         }
39         //printf("both: %d, myjoker: %d \n", cnt, myjoker ? 1 : 0);
40         printf("%.10f\n", myjoker ? f[cnt] : p[cnt]);
41     }
42     return 0;
43 }
View Code

C:

队友嘴炮完(但是并没有敲完)的构造题。

D:

看了完全莫得想法的题目,感觉有点像是贪心?

E:

某个队友上来就表示这题很可写,然后被我劝去做B了,最后没搞出来。

F:

傻逼题,题意题。

 1 #include<bits/stdc++.h>
 2 #define ll long long
 3 
 4 using namespace std;
 5 
 6 map<string, int> M;
 7 vector<string> v;
 8 
 9 int main()
10 {
11     int t;
12     cin >> t;
13     while (t)
14     {
15         string x;
16         getline(cin, x);
17         if (x == "") continue;
18         string tmp = "";
19         for (int i = 0; i < x.length(); i++)
20         {
21             if ('A' <= x[i] && x[i] <= 'Z')
22             {
23                 tmp += x[i];
24             }
25         }
26         M[tmp] ++ ;
27         if (M[tmp] == 1)
28         {
29             v.push_back(tmp);
30         }
31         t--;
32     }
33     ll ans = 0;
34     for (int i = 0; i  < v.size(); i++)
35     {
36         ll x = M[v[i]];
37         ans += x * (x - 1) / 2ll;
38     }
39     cout << ans << endl;
40     return 0;
41 }
View Code

G:

一道很有意思的交互。从n==5的情况出发,先构造出有解的情况,之后再不停地加点上去就可以了。

 1 #include <cstdio>
 2 
 3 int main(void)
 4 {
 5     int T;
 6     scanf("%d", &T);
 7     while (T--)
 8     {
 9         int n, st;
10         int st1, st2, st3;
11         scanf("%d", &n);
12         printf("1 2 2 3\n");
13         fflush(stdout);
14         scanf("%d", &st1);
15         printf("3 4 4 5\n");
16         fflush(stdout);
17         scanf("%d", &st2);
18         if (st1 == st2)
19         {
20             printf("5 1 1 4\n");
21             fflush(stdout);
22             scanf("%d", &st3);
23             if (st1 == st3)
24             {
25                 printf("1 3 3 5\n");
26                 fflush(stdout);
27                 scanf("%d", &st);
28             }
29             else
30             {
31                 printf("2 5 5 3\n");
32                 fflush(stdout);
33                 scanf("%d", &st);
34             }
35         }
36         else
37         {
38             printf("5 3 3 1\n");
39             fflush(stdout);
40             scanf("%d", &st3);
41             if (st1 == st3)
42             {
43                 printf("1 5 5 2\n");
44                 fflush(stdout);
45                 scanf("%d", &st);
46             }
47             else
48             {
49                 printf("1 5 1 4\n");
50                 fflush(stdout);
51                 scanf("%d", &st);
52             }
53         }
54         for (int i = 6; i <= n; i++)
55         {
56             printf("%d 1 %d 2\n", i, i);
57             fflush(stdout);
58             scanf("%d", &st);
59         }
60     }
61     return 0;
62 }
View Code

H:

分情况讨论就可以了。

 1 #include<bits/stdc++.h>
 2 
 3 using namespace std;
 4 
 5 typedef long long ll;
 6 
 7 ll gcd(ll a, ll b)
 8 {
 9     if (a % b == 0) return b;
10     else return gcd(b, a % b);
11 }
12 
13 int main()
14 {
15     ll h, m;
16     cin >> h >> m;
17     if (h <= m)
18     {
19         ll x1 = h;
20         ll x2 = 2ll * m - h + 1;
21         ll a = x1 * x2 / 2ll;
22         ll b = h * m;
23         ll g = gcd(a, b);
24         a /= g; b /= g;
25         cout << a << '/' << b << endl;
26     }
27     else
28     {
29         ll a = m * (m + 1) / 2ll;
30         ll b = h * m;
31         ll g = gcd(a, b);
32         a /= g; b /= g;
33         cout << a << '/' << b << endl;
34     }
35 
36     return 0;
37 }
View Code

I:

队友没发现输入并不保证正确,wa了好多发……

解法倒是非常傻,floyd就完事了。

 1 #include<bits/stdc++.h>
 2 
 3 using namespace std;
 4 
 5 const int maxn = 2000;
 6 const int INF = 1e5;
 7 
 8 int A[maxn][maxn];
 9 int f[maxn][maxn];
10 
11 int main()
12 {
13     int T;
14     scanf("%d", &T);
15     while (T--)
16     {
17         int n, fg = 0;
18         scanf("%d", &n);
19         for (int i = 1; i <= n; i++)
20             for (int j = 1; j <= n; j++)
21             {
22                 scanf("%d", &A[i][j]);
23                 f[i][j] = A[i][j]; //copy
24             }
25         for (int i = 1; i <= n; i++)
26         {
27             f[i][i] = 0; //dui jiao must be zero
28             for (int j = 1; j <= n; j++)
29             {
30                 if (f[i][j] != -1 && f[j][i] != -1 && f[i][j] != f[j][i])
31                 {
32                     fg = 1; goto mark;
33                 }
34                 if (f[i][j] == -1 && f[j][i] != -1)
35                     f[i][j] = f[j][i];
36                 else if (f[i][j] == -1) f[i][j] = INF;
37             }
38         }
39         //floyd
40         for (int k = 1; k <= n; k++)
41             for (int i = 1; i <= n; i++)
42                 for (int j = 1; j <= n; j++)
43                     f[i][j] = min(f[i][k] + f[k][j], f[i][j]);
44         for (int i = 1; i <= n; i++)
45             for (int j = 1; j <= n; j++)
46             {
47                 if (A[i][j] != -1 && f[i][j] != A[i][j])
48                 {
49                     fg = 1;
50                     goto mark;
51                 }
52             }
53 mark:;
54         if (fg) printf("NO\n");
55         else
56         {
57             printf("YES\n");
58             for (int i = 1; i <= n; i++)
59             {
60                 for (int j = 1; j <= n; j++)
61                 {
62                     if (j == 1) printf("%d", f[i][j]);
63                     else
64                     {
65                         printf(" %d", f[i][j]);
66                     }
67                 }
68                 printf("\n");
69             }
70         }
71     }
72     return 0;
73 }
View Code

J && K:

没看。

L:

还没看就被队友秒了,说是sb贪心(还抢了gym的一血

 1 #include<bits/stdc++.h>
 2 
 3 using namespace std;
 4 int A[20];
 5 
 6 int main()
 7 {
 8     int T;
 9     scanf("%d", &T);
10     while (T--)
11     {
12         for (int i = 1; i <= 6; i++)
13             scanf("%d", &A[i]);
14         int ans = A[6];
15         A[6] = 0;
16         ans += A[5];
17         A[1] -= A[5];
18         ans += A[4];
19         if (A[2] <= A[4])
20         {
21             A[4] -= A[2];
22             A[2] = 0;
23             A[1] -= A[4] * 2;
24         }
25         else
26         {
27             A[2] -= A[4];
28         }
29         ans += A[3] / 2;
30         A[3] %= 2;
31         if (A[3] == 1)
32         {
33             ans ++;
34             int x = 3;
35             if (A[2] >= 1)
36             {
37                 A[2] --;
38                 x -= 2;
39             }
40             A[1] -= x;
41         }
42         ans += A[2] / 3;
43         A[2] %= 3;
44         if (A[2] >= 1)
45         {
46             ans ++;
47             A[1] -= 6 - A[2] * 2;
48         }
49         if (A[1] >= 1) ans += (A[1] + 5) / 6;
50         printf("%d\n", ans);
51     }
52     return 0;
53 }
View Code

猜你喜欢

转载自www.cnblogs.com/JHSeng/p/10803149.html