Codeforces Round #559 (Div. 2)

打完省赛回来写了总结,有点累,就没想着打这场了 (竟然有wxh出题,wxh天下第一 !)

题目链接:https://codeforces.com/contest/1159


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 int n, cnt = 0;
41 string s;
42 
43 int main()
44 {
45     cin >> n >> s;
46     for (auto i : s)
47         if (i == '+') cnt++;
48         else if (cnt) cnt--;
49     if (cnt <= 0) puts("0"); else printf("%d\n", cnt);
50     return 0;
51 }
View Code

B:

题目说什么K-expansion根本不需要看懂,有不等式就够了。

看似要O(n^2)其实根本不需要,把abs(i-j)移项并拆开之后发现这题其实就是要求最小的a[i]/abs(i-j),显然j是1和n二选一,于是变成a[i]/max(n-i,i-1)。时间复杂度O(n),正确性显然。

 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 = 3e5 + 10;
41 int n, x, ans = int_inf;
42 
43 int main()
44 {
45     scanf("%d", &n);
46     rep1(i, 1, n)
47     {
48         scanf("%d", &x);
49         ans = min(ans, x / max(n - i, i - 1));
50     }
51     printf("%d\n", ans);
52     return 0;
53 }
View Code

C:

有n个男生和m个女生。对于任意一对男女生,男生有可能送任意多的礼物给女生(也可能不送)。定义a[i][j]为第i个男生送给第j个女生礼物的数量。

给定n个数,b[i]=min(a[i][1]……a[i][m]);给定m个数,c[i]=max(a[1][i]……a[n][i])。问所有男生最少送了多少礼物,无解输出-1。

读完题就知道这很显然是个贪心。-1的情况很明显:如果max(b[i])>min(c[i]),不可能存在这种情况,必然无解。

而且很显然,答案必定是sum(c[i])再加些什么东西上去。为了要ans最小,当然是加上(sum(b[i])-max(b[i]))*m:所有的女生除了收到最多的礼物之外,还收到了剩下(n-1)个男生送出的最少分量的礼物。

问题来了,如果max(b[i])==min(c[i]),上面的答案不会有问题。如果max(b[i])<min(c[i])呢?ans+=最大b[i]-次大b[i],补上去就完事了。

 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 int n, m;
41 ll firLar = 0, secLar = 0, ans, minn = ll_inf, sum1 = 0, sum2 = 0;
42 
43 int main()
44 {
45     scanf("%d%d", &n, &m);
46     rep1(i, 1, n)
47     {
48         ll x; scanf("%lld", &x);
49         if (firLar <= x)
50         {
51             secLar = firLar;
52             firLar = x;
53         }
54         else if (secLar <= x) secLar = x;
55         sum1 += x;
56     }
57     rep1(i, 1, m)
58     {
59         ll x; scanf("%d", &x);
60         minn = min(minn, x);
61         sum2 += x;
62     }
63     if (firLar > minn) return puts("-1"), 0;
64     ans = sum2 + (sum1 - firLar) * m;
65     printf("%lld\n", (firLar < minn) ? ans + firLar - secLar : ans);
66     return 0;
67 }
View Code

D:

定义unique string t是在原字符串s里只出现过一次的子串t,这里说的子串要连续。原字符串s只包含0和1两个数字。

现在题目给定s串和t串的长度,要求构造合法的s串,使得它最短的unique string长度恰好为k。

非常有趣的一道题目。Description后面谈到的(n mod 2)=(k mod 2),n和k奇偶性相同,仿佛在暗示什么,但我就是猜不出正确做法。感觉肯定有种奇怪的构造方式能符合题意。

看完题解发现果然如此。由于还没有英文题解,只知其然而不知其所以然(后面的毛子文看不懂……)。

令a=(n-k)/2,由于题目说了n、k奇偶性相同,易知a必然是一个整数。答案的构造方法是:先输出a个0,再输出一个1,循环a+1遍上述操作。

不过tutorial下面有神仙说这题根本不难,打表就容易发现构造方法了(problem tags里的brute force强烈暗示打表)。也许对于不同的n只有一种可行解?

这题的std可怕地短。

 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 int n, k, delta;
41 
42 //服了
43 int main()
44 {
45     scanf("%d%d", &n, &k); delta = (n - k) / 2 + 1;
46     rep1(i, 1, n) printf("%d", i % delta == 0);
47     puts("");
48     return 0;
49 }
View Code

E && F:

神仙题,再见。

猜你喜欢

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