本来可以很欢乐的,结果由于参与人数众多,服务器过于土豆,硬是把手速场变成网速场。难度cf div3左右。
赛后中了抽奖23333然而只能选T恤,不能选日系短裙,不然就送hry裙子好了 (此处呲牙笑
大模拟我就不补了,该歇了(
题目链接:https://cometoj.com/contest/42
A:
求1+2+...+n+(n-1)+...+1,答案就是n^2。
太水,代码就不贴了。记得开long long即可。
B:
给n个数(n<=14),问最多选出多少个数,使得两两互质。
因为n非常小,二进制枚举,O(n^2)验证秒杀。
1 /* basic header */ 2 #include <bits/stdc++.h> 3 /* define */ 4 #define ll long long 5 #define dou double 6 #define pb emplace_back 7 #define mp make_pair 8 #define sot(a,b) sort(a+1,a+1+b) 9 #define rep1(i,a,b) for(int i=a;i<=b;++i) 10 #define rep0(i,a,b) for(int i=a;i<b;++i) 11 #define eps 1e-8 12 #define int_inf 0x3f3f3f3f 13 #define ll_inf 0x7f7f7f7f7f7f7f7f 14 #define lson curPos<<1 15 #define rson curPos<<1|1 16 /* namespace */ 17 using namespace std; 18 /* header end */ 19 20 const int maxn = 15; 21 int t, a[maxn]; 22 23 int check(set<int> &s) { 24 int b[maxn],p=0; 25 for (auto i:s) b[++p]=i; 26 for (int i=1;i<=p;i++) 27 for (int j=i+1;j<=p;j++) 28 if (__gcd(b[i],b[j])>1) return 0; 29 return 1; 30 } 31 32 int main() { 33 cin >> t; 34 while (t--) { 35 int n, ans = 1; 36 cin >> n; 37 rep1(i, 1, n) cin >> a[i]; 38 for (int cnt = 1; cnt < (1 << n); cnt++) { 39 int tmp = cnt; 40 set<int>s; s.clear(); 41 rep1(i, 1, n) { 42 if (tmp & 1) s.insert(a[i]); 43 tmp >>= 1; 44 } 45 if (check(s)) ans = max(ans, (int)s.size()); 46 } 47 cout << ans << endl; 48 } 49 return 0; 50 }
C:
给定字符串s,t,问t是否为s刚好删去两个字符的结果。
注意s为两个字符的情况就好了(也就是t为空串)。
1 /* basic header */ 2 #include <bits/stdc++.h> 3 /* define */ 4 #define ll long long 5 #define dou double 6 #define pb emplace_back 7 #define mp make_pair 8 #define sot(a,b) sort(a+1,a+1+b) 9 #define rep1(i,a,b) for(int i=a;i<=b;++i) 10 #define rep0(i,a,b) for(int i=a;i<b;++i) 11 #define eps 1e-8 12 #define int_inf 0x3f3f3f3f 13 #define ll_inf 0x7f7f7f7f7f7f7f7f 14 #define lson curPos<<1 15 #define rson curPos<<1|1 16 /* namespace */ 17 using namespace std; 18 /* header end */ 19 20 int main() { 21 int t; cin >> t; cin.get(); 22 while (t--) { 23 // string s, t; cin >> s >> t; 24 string s, t; 25 getline(cin, s); 26 getline(cin, t); 27 int len1 = s.size(), len2 = t.size(), cnt = 0; 28 if (len1 - len2 != 2) { 29 puts("0"); continue; 30 } 31 if (len2 == 0 && len1 == 2) { 32 puts("1"); continue; 33 } 34 for (int p1 = 0, p2 = 0; p1 < len1; p1++) { 35 if (p2>=len2 || s[p1] != t[p2]) { 36 cnt++; 37 } else ++p2; 38 } 39 if (cnt != 2) puts("0"); else puts("1"); 40 } 41 return 0; 42 }
D:
给定18个数字,数字的范围是[0,13],数字可能重复但重复度不超过4。对于每个重复的数字可以做如下操作(只能对[1,13]之间的数字操作):若该数字重复度为2或4,则可以把该数字全部删去;若该数字重复度为3,则可以删去两个该数字。问最后最少剩下多少数字。
没什么可说的,模拟就完事了。
1 /* basic header */ 2 #include <bits/stdc++.h> 3 /* define */ 4 #define ll long long 5 #define dou double 6 #define pb emplace_back 7 #define mp make_pair 8 #define sot(a,b) sort(a+1,a+1+b) 9 #define rep1(i,a,b) for(int i=a;i<=b;++i) 10 #define rep0(i,a,b) for(int i=a;i<b;++i) 11 #define eps 1e-8 12 #define int_inf 0x3f3f3f3f 13 #define ll_inf 0x7f7f7f7f7f7f7f7f 14 #define lson curPos<<1 15 #define rson curPos<<1|1 16 /* namespace */ 17 using namespace std; 18 /* header end */ 19 20 const int maxn = 20; 21 int a[maxn]; 22 23 int main() { 24 rep0(i, 0, maxn) a[i] = 0; 25 rep1(i, 1, 18) { 26 int x; cin >> x; 27 a[x]++; 28 } 29 rep0(i, 1, maxn) { 30 if (a[i] == 2 || a[i] == 4) a[i] = 0; 31 if (a[i] == 3) a[i] -= 2; 32 } 33 int ans = 0; 34 rep0(i, 0, maxn) ans += a[i]; 35 cout << ans << endl; 36 return 0; 37 }
E:
给定一个n*n的迷宫,迷宫里的格子只有路和墙。给定起点和终点,起点下方必定有墙。规定要用右手贴着地图中起点下方的墙壁一直沿着墙壁往前走(保证能走到终点)。要求把路程中右手贴的每一面墙在地图里的方向记录下来并按顺序输出。地图是不会旋转的。
很无聊的大模拟……
F:
给定一个n*m的矩阵,每个2*2子矩阵可以种一棵树,接下来给定q次变化,每次变化会ban掉一个格子。含有被ban掉的格子的子矩阵不可以种树。对于每次给定的变化,给出当前矩阵最多可以种多少棵树。
这很明显是个数学题。对于一个被ban掉的格子,它可以影响二、三、四个子矩阵。计算初始矩阵最多种多少棵树,然后对于每次查询计算影响即可。
(然而我那晚读错题了,以为是对于每次查询,给出当前状态的矩阵最多可以种多少棵树,题目一下子变得很烦
1 /* basic header */ 2 #include <bits/stdc++.h> 3 /* define */ 4 #define ll long long 5 #define dou double 6 #define pb emplace_back 7 #define mp make_pair 8 #define sot(a,b) sort(a+1,a+1+b) 9 #define rep1(i,a,b) for(int i=a;i<=b;++i) 10 #define rep0(i,a,b) for(int i=a;i<b;++i) 11 #define eps 1e-8 12 #define int_inf 0x3f3f3f3f 13 #define ll_inf 0x7f7f7f7f7f7f7f7f 14 #define lson curPos<<1 15 #define rson curPos<<1|1 16 /* namespace */ 17 using namespace std; 18 /* header end */ 19 20 const int maxn = 1e3 + 10; 21 int n, m, q, a[maxn][maxn], curr = 0; 22 23 int main() { 24 cin >> n >> m >> q; 25 rep0(i, 1, n) { 26 rep0(j, 1, m) { 27 a[i][j] = 1; 28 curr++; 29 } 30 } 31 while (q--) { 32 int x, y; cin >> x >> y; 33 rep0(i, 0, 2) { 34 rep0(j, 0, 2) { 35 if (a[x - i][y - j]) a[x - i][y - j] = 0, curr--; 36 } 37 } 38 printf("%d ", curr); 39 } 40 return 0; 41 }
G:
黑白棋相关的题目。又是个大模拟。
H:
有个皮球从高处掉落,根据物理知识,它会弹起。现在按照时间顺序给定n个球的不同高度(>0),问球至少落地几次。
贪心。不妨设球一开始向下运动,每读入一个新的高度,判断球是否必须转向才可达到新的高度。
无论是问至少还是至多,这题都很好做。
1 /* basic header */ 2 #include <bits/stdc++.h> 3 /* define */ 4 #define ll long long 5 #define dou double 6 #define pb emplace_back 7 #define mp make_pair 8 #define sot(a,b) sort(a+1,a+1+b) 9 #define rep1(i,a,b) for(int i=a;i<=b;++i) 10 #define rep0(i,a,b) for(int i=a;i<b;++i) 11 #define eps 1e-8 12 #define int_inf 0x3f3f3f3f 13 #define ll_inf 0x7f7f7f7f7f7f7f7f 14 #define lson curpos<<1 15 #define rson curpos<<1|1 16 /* namespace */ 17 using namespace std; 18 /* header end */ 19 20 int last = int_inf, dire = 1, n, ans = 0; //1 is down and 0 is up 21 22 int main() { 23 cin >> n; 24 while (n--) { 25 int x; cin >> x; 26 if (dire) { 27 if (x >= last) { 28 dire = 0; 29 ans++; 30 } 31 } else if (x <= last) 32 dire = 1; 33 last = x; 34 } 35 printf("%d ", ans); 36 return 0; 37 }