BestCoder Round #15(瞎搞)

1001:题意就是给2个字符串,输出_后面的内容再加上_small_,水题。

#include<cstdio>
char s[50],s2[50],s3[50],s4[40];
int main(){
    while(scanf("%[^_]_%s%[^_]_%s",s3,s,s4,s2) == 4){
        printf("%s_small_%s\n", s, s2);
    }
    return 0;
}

1002:该死的字符串,错了10086次。就是模拟模拟。发现自己对这种细节超多的题目特别蛋疼。

#include<cstdio>
char s1[50],s2[50],s3[50],s4[40];
char name[][20] = {"","ADD","SUB","DIV","MUL","MOVE","SET"};
void print(int x, int t){
    if(t == 0){
        return;
    }
    print(x/2, t-1);
    printf("%d", x%2);
}
void print(int x){
    print(x,5);
}
int get(char *s,int n){
    int d = 0;
    for(int i = 0; i < n; i++){
        d = d * 2 + s[i] - '0';
    }
    return d;
}
bool check(char *s){
    int i = 0;
    while(s[i]){
        if(s[i]!='0' && s[i]!='1')return false;
        i++;
    }
    return i==16;
}
int main(){
    int n;
    while(scanf("%d", &n) == 1){
        if(n == 1){
            scanf("%s%s",s1,s2);
            int x;
            if(s1[0] == 'A') print(1,6);
            else if(s1[0] == 'S' && s1[1] == 'U' ) print(2,6);
            else if(s1[0] == 'D') print(3,6);
            else if(s1[1] == 'U') print(4,6);
            else if(s1[1] == 'O') print(5,6);
            else print(6,6);
            int d = 0;
            for(x = 1; s2[x]!=','&&s2[x];x++){
                d = d * 10 + s2[x] - '0';
            }
            print(d);
            d = 0;
            if(s2[x]){
                for(x+=2; s2[x]; x++){
                    d = d * 10 + s2[x] - '0';
                }
            }
            print(d);
            printf("\n");
        }else{
            scanf("%s",s1);
            if(!check(s1)){printf("Error!\n");continue;}
            int n1 = get(s1,6), n2 = get(s1+6,5), n3 = get(s1+11, 5);
            if(n1==0||n1>6||n2==0||(n3==0&&n1!=6||n3!=0&&n1==6)) printf("Error!\n");
            else{
                printf("%s ", name[n1]);
                printf("R%d", n2);
                if(n3) printf(",R%d", n3);
                printf("\n");
            }
        }
    }
    return 0;
}

1003:比赛的时候因为1002错了太多,时间不够没做出来,赛后A出来内牛满面无数草泥马向1002奔腾而去。

就是给一个矩阵,然后做一个自乘,然后给100000个r,c 求r行c列的元素和。因为矩阵是1000的,所以o(n^3)的乘法不行,但是他给的矩阵元素是有规律的,所以可以优化。推导后发现,P[i][j] = P[i-1][j-1] - M[i-1][n-1] * M[n-1][j-1] + M[i][0] * M[0][j];(M为原矩阵,P = M * M),最后还有个trick就是最后的结果要用long long 存。

#include<cstdio>
int a[2005];
int n;
int P[1005][1005];
int M[1005][1005];
int main(){
    while(scanf("%d", &n)==1){
        for(int i = 0; i <= 2*n-2; i++)
            scanf("%d", &a[i]);
        for(int i = 0; i < n; i++){
            for(int j = 0; j < n; j++){
                M[i][j] = a[n-1-i+j];
            }
        }
        for(int i = 0; i < n; i++){
            P[i][0] = P[0][i] = 0;
            for(int k = 0; k < n; k++){
                P[i][0] += M[i][k] * M[k][0];
                if(i != 0) P[0][i] += M[0][k] * M[k][i];
            }
        }
        for(int i = 1; i < n; i++){
            for(int j = 1; j < n; j++){
                P[i][j] = P[i-1][j-1] - M[i-1][n-1] * M[n-1][j-1] + M[i][0] * M[0][j];
            }
        }
        int m;scanf("%d", &m);
        int r,c;
        long long sum=0;
        int ans = 0;
        while(m--){
            scanf("%d%d", &r, &c);
            sum += (ans = P[(ans+r)%n][(ans+c)%n]);
        }
        printf("%I64d\n", sum);
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值