A - AtCoder Quiz 3
签到签到签到
代码:
#include<bits/stdc++.h> using namespace std; int main() { int n; cin>>n; if(n >= 42) n++; printf("AGC%.3d", n); return 0; }
B - Triple Metre
题意: 判断一个由 'o' 和 'x' 组成的字符串是否是 oxx
的子字符串
题解:
稍微判断一下前后顺序就行了
代码:
include<bits/stdc++.h> using namespace std; int main() { string k; cin>>k; int n = k.length(); for(int i = 0; i < n - 1; i++){ if(k[i] == 'o' && (k[i + 1] != 'x' || (k[i + 2] != 'x' && i + 2 < n))){ printf("No"); return 0; } if(k[i] == 'x' && k[i - 1] == 'x' && k[i + 1] == 'x'){ printf("No"); return 0; } } printf("Yes"); }
C - X drawing
题目大意:
给了一个n*n
的矩阵, 然后再给了两个k的范围,要求你将给定范围(P, Q)
到(R,S)
内的所有坐标为(A + k,B + k)
和 (A + K, B - K)
的点全部标记为'#', 其他标记为'.'并打印。
思路:
就是模拟吧
因为k是相同的所以斜率是1或者-1, 即i - a == j - b
或者 i - a == b - j
,然后根据他A
和B
是大于0的,所以k实际上是没有最小值的,只需要判断小于最大值。
所以再判断一下k > k1max
和k > k2max
就好了
唯一注意就是要开long long
代码:
#include<bits/stdc++.h> using namespace std; int main() { long long n,a,b,p,q,r,s; cin>>n>>a>>b>>p>>q>>r>>s; long long k1max = min(n - a, n - b); long long k2max = min(n - a, b - 1); for(long long i = p; i <= q; i++){ for(long long j = r; j <= s; j++){ long long k = i - a; if(i - a == j - b){ if(k > k1max){ printf(".");continue; } printf("#"); } else if(i - a == b - j){ if(k > k2max){ printf(".");continue; } printf("#"); } else { printf("."); } } printf("\n"); } }
D - Destroyer Takahashi
题目大意:
有N
个线段,每次可以选取一段D-1
长度的范围,把包括在里面的线段全部消去,问最少多少次才能全部消去。
题解:
当时犯病了竟然这都没想出来,其实就是按右端点排序然后判断左端点是否在上一个范围之内,在就一起消掉了,不然就ans++;
代码:
#include<bits/stdc++.h> using namespace std; struct wall{ int L,R; bool operator<(wall b){ return R < b.R; } } wa[200010]; int main(){ int n,d; cin>>n>>d; for(int i = 0; i < n; i++){ scanf("%d %d", &wa[i].L, &wa[i].R); } sort(wa, wa + n); int now = wa[0].R; int ans = 1; for(int i = 1; i < n; i++){ if(wa[i].L > now + d - 1){ ans++; now = wa[i].R; } } printf("%d", ans); }