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\n",res);
        printf("%d",c[0]);
        for(int i = 1;i < cnt;i++)printf(" %d",c[i]);
        printf("\n");
    }
    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\n",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\n",i,li[i],disli[i]);
    }
    int a,b;
    while(~scanf("%d%d",&a,&b)&&a+b){
        printf("%d %d\n",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\n",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] = '\n';
            if(cnt1%16==0&&cnt1!=0)printf("\n");
            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\n",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\n",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("\n");
    }
    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\n",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\n",num);
        } else printf("None\n");

    }
    return 0;
}
posted @ 2017-06-09 22:04  adfae  阅读(578)  评论(0编辑  收藏  举报