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 ,然后根据他AB是大于0的,所以k实际上是没有最小值的,只需要判断小于最大值。

所以再判断一下k > k1maxk > 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);
}