zoukankan      html  css  js  c++  java
  • 2017程序设计练习题之暴力专题2

    A题

    //A题最朴素的想法是每个A中的元素都在B中去查找看能否查到,于是可能就有o(n^2)的复杂度对于100000的数据是不能过的,用二分查找就可以了。
    我这里的思路的话是o(n+m)的复杂度,就是设两个记号i和j,刚开始时都为0,然后由于两者都是有序的,让跑的慢的去追快的。如果a[i] < a[j]i++,a[i] > a[j] j++;如果两者相等i++,j++;
    //如果还是不是很理解就看下代码吧,形容能力有限抱歉。
    
    #include<bits/stdc++.h>
    
    using namespace std;
    const int maxn = 100010;
    int a[maxn];
    int b[maxn];
    int c[maxn];
    int main(){
        int T;
        scanf("%d",&T);
        while(T--){
            int k,j,m,n;
            scanf("%d%d",&m,&n);
            for(int i = 0;i < m;i++)scanf("%d",&a[i]);
            for(int i = 0;i < n;i++)scanf("%d",&b[i]);
            int res = 0;
            k = 0;
            j = 0;
            int cnt = 0;
            while(k < m&&j < n){
                if(a[k] < b[j]){
                    k++;
                }else if(a[k]==b[j]){
                    c[cnt++] = a[k];
                    k++;
                    j++;
                    res++;
                }else j++;
            }
            //cout<<k<<" "<<j<<endl;
            printf("%d
    ",res);
            printf("%d",c[0]);
            for(int i = 1;i < cnt;i++)printf(" %d",c[i]);
            printf("
    ");
        }
        return 0;
    }
    
    

    B题

    //其实这题关键是从字符串中提取a,b,c可以用c语言的sscanf(),我这里是自己模拟写的。然后这里用eof结尾windows下cltr+z结束。
    #include<bits/stdc++.h>
    
    using namespace std;
    char s[100];
    int main(){
        int cnt = 0;
        while(gets(s)!=0){
            int a[3]={0,0,0};
            char c = 'a';
            int len = strlen(s);
            int cnt1 = 0;
            if(s[len-1]=='=')continue;
            for(int i = 0;i < len;i++){
                if(s[i]=='='){
                    cnt1++;
                    continue;
                }
                if(s[i]=='+'||s[i]=='-'){
                    cnt1++;
                    c = s[i];
                    continue;
                }
                a[cnt1] *=10;
                a[cnt1] +=(s[i]-'0');
            }
    
            if(c=='+'&&a[0]+a[1]==a[2])cnt++;
            if(c=='-'&&a[0]-a[1]==a[2])cnt++;
            
        }
        printf("%d
    ",cnt);
        return 0;
    }
    
    

    C题

    //这题就是打表的思路,用like[i]表示到i这里有多少个喜欢的数,dislike[i]表示多少个不喜欢的数,然后结果计算时相减,大一时很多这种类型的题就不详解了。
    sing namespace std;
    const int maxn = 1000000+5;
    int li[maxn];
    int disli[maxn];
    
    
    int dislike(int a){
        while(a){
            if(a%10==4||a%10==7)return 1;
            a/=10;
        }
        return 0;
    }
    int like(int a){
        if(dislike(a))return 0;
        while(a){
            if(a%10==3||a%10==6)return 1;
            a/=10;
        }
        return 0;
    }
    
    int main(){
        disli[0] = 0;
        li[0] = 0;
        for(int i = 1;i < maxn;i++){
            li[i] = li[i-1] + like(i);
            disli[i] = disli[i-1] + dislike(i);
            //if(i<=100)printf("%d %d %d
    ",i,li[i],disli[i]);
        }
        int a,b;
        while(~scanf("%d%d",&a,&b)&&a+b){
            printf("%d %d
    ",li[b]-li[a-1],disli[b]-disli[a-1]);
        }
        return 0;
    }
    

    D题

    //先计算前缀和,就是sum[i] = sum[i-1]  + a[i];然后i到j的字段和就是sum[j] - sum[i-1],暴力所有的字段和求最大值。
    #include<bits/stdc++.h>
    
    using namespace std;
    const int maxn = 100000+5;
    int a[maxn];
    int sum[maxn];
    
    int main(){
        int n,m;
        while(~scanf("%d%d",&n,&m)&&n+m){
            int Max = -1;
            sum[0] = 0;
            for(int i = 1;i <= n;i++){
                scanf("%d",&a[i]);
                sum[i] = sum[i-1] + a[i];
            }
            for(int i = 1;i <= n-m+1;i++){
                Max = max(Max,sum[i+m-1]-sum[i-1]);
            }
            printf("%d
    ",Max);
        }
        return 0;
    }
    

    E题

    //这题我是把所有的字符串全部输入进来后,每条处理。没处理一个字符cnt++,cnt%16==0就cnt_row++不过要注意回车算字符。
    #include<bits/stdc++.h>
    
    using namespace std;
    char str[100000][1000];
    int main(){
        int cnt = 0;
        while(gets(str[cnt++])!=0);
        cnt--;
        int cnt1 = 0;
        int cnt_row = 0;
        for(int i = 0;i < cnt ;i++){
            int len = strlen(str[i]);
            for(int j = 0;j <= len;j++){
                if(j==len)str[i][j] = '
    ';
                if(cnt1%16==0&&cnt1!=0)printf("
    ");
                if(cnt1%16==0)printf("%05X",cnt_row++);
                cnt1++;
                if(cnt1%16==1)printf(" %02X",str[i][j]);
                else printf(" %02X",str[i][j]);
            }
        }
        return 0;
    }
    
    

    F题

    //刚开始以为是搜索,结果只有3个可以三重循环暴力搞..........
    #include<iostream>
    #include<stdio.h>
    using namespace std;
    int main(){
        int time;
        scanf("%d",&time);
        while(time--){
            int ret[4][4];
            int i,j,k;
            for(i=0;i<4;i++){
                for(j=0;j<4;j++){
                    scanf("%d",&ret[i][j]);
                }
            }
            int d[4][4][4];
            int flag[6]={0,0,0,0,0,0};
            int cost[6];
            char route[6][6]={{"1 2 3"},{"1 3 2"},{"2 1 3"},{"2 3 1"},{"3 1 2"},{"3 2 1"}};
            int min=100000000;
            for(i=1;i<4;i++){
                for(j=1;j<4;j++){
                    for(k=1;k<4;k++){
                        if(i!=j&&j!=k&&i!=k){
                            d[i][j][k]=ret[0][i]+ret[i][j]+ret[j][k]+ret[k][0];
                            if(d[i][j][k]<min)min=d[i][j][k];
                        }
                    }
                }
            }
            
            printf("%d
    ",min);
            for(i=1;i<4;i++){
                for(j=1;j<4;j++){
                    for(k=1;k<4;k++){
                        if(i!=j&&j!=k&&i!=k&&d[i][j][k]==min){
                            printf("%d %d %d
    ",i,j,k);
                        }
                    }
                }
            }
        }
        return 0;
    }
    

    G题

    //这题...不就是...如果字符串下标为3,4,5,6时输入"*"否则输入s[i]完美
    #include<bits/stdc++.h>
    
    using namespace std;
    
    int main()
    {
        int T;
        scanf("%d",&T);
        while(T--){
            char s[20];
            scanf("%s",s);
            for(int i = 0;i < 11;i++){
                if(i>=3&&i<=6)printf("*");
                else printf("%c",s[i]);
            }
            printf("
    ");
        }
        return 0;
    }
    
    

    H题

    //计算X,T,U三个字符中出现次数最少的。
    #include<stdio.h>
    int main(){
        int time;
        char a[1010];
        scanf("%d",&time);
        while(time--){
            scanf("%s",a);
            int cnt[3]={0,0,0};
            int i;
            for(i=0;a[i];i++){
                if(a[i]=='X') cnt[0]++;
                else if(a[i]=='T') cnt[1]++;
                else if(a[i]=='U') cnt[2]++;
            }
            int min=cnt[0];
            if(cnt[1]<min) min=cnt[1];
            if(cnt[2]<min) min=cnt[2];
            
            printf("%d
    ",min);
        }
        return 0;
    }
    

    I题

    //暴力i找能不能a2+i2=b2或者a2+b2=i2
    #include<iostream>
    #include<stdio.h>
    using namespace std;
    int main() {
        int time;
        scanf("%d",&time);
        while(time--) {
            int a,b,c;
            scanf("%d %d",&a,&b);
            int flag=0,num=0;
            for(int i=3; i<=11000; i++) {
                if((a*a+b*b==i*i)||(a*a+i*i==b*b)||(b*b+i*i==a*a)) {
                    flag=1;
                    num=i;
                    break;
                }
            }
            if(flag) {
                printf("%d
    ",num);
            } else printf("None
    ");
    
        }
        return 0;
    }
    
  • 相关阅读:
    node项目发布pm2
    图片地址获取图片信息
    前端文件上传 获取文件大小 获取图片宽高
    前端上传图片预览
    vue按钮防暴力点击
    小程序父子组件之间的通信
    form表单
    es6-函数的扩展
    php的魔术常量以及类的模式方法
    OpenStack笔记
  • 原文地址:https://www.cnblogs.com/wlxtuacm/p/6973961.html
Copyright © 2011-2022 走看看