1. 程式人生 > >程式設計實踐練習(執行,暴力)2

程式設計實踐練習(執行,暴力)2

Problem A Balloon

題目描述
ICPC比賽當你過了一道題以後,會發一個標識這道題顏色的氣球。 現給你2個隊過的氣球的顏色,求他們都過了的氣球是哪些?
輸入
第一行是一個整數K,表示樣例的個數(K≤100)。 每個樣例的第一行是兩個整數N和M,1≤N,M≤100000,表示兩個隊分別過題的數量; 第二、三行分別是N和M個有序的整數Xi和Yi,0≤Xi,Yi≤109,表示氣球的顏色。 輸入資料保證集合{Xi}和{Yi}的元素都是唯一的,且兩個集合一定存在交集
輸出
每個樣例輸出兩行,第一行輸出相同的過題數目S,第二行按升序輸出S個整數,每個整數之間空一個空格。
樣例輸入


2
3 3
1 2 3
1 2 3
3 2
1 2 3
2 3
樣例輸出
3
1 2 3
2
2 3

#include<bits/stdc++.h> 
#define N 100002
using namespace std;

int teamn[N];
int teamm[N];
int same[N];

int main(){
    int k,n,m,i,j,cnt;
    //memset(same,0,sizeof(same));
    scanf("%d",&k);
    while(k--){
        cnt=0
; scanf("%d %d",&n,&m); for(j=0;j<n;j++)scanf("%d",&teamn[j]); for(i=0;i<m;i++)scanf("%d",&teamm[i]); i=0; j=0; while(j<n&&i<m){ if(teamm[i]>teamn[j])j++; else if(teamm[i]==teamn[j]){ same[cnt++]=teamm[i]; i++; j++; } else
i++; } printf("%d\n",cnt); for(i=0;i<cnt-1;i++)printf("%d ",same[i]); printf("%d\n",same[cnt-1]); } return 0; }

Problem B 算術題

題目描述
小明在做加減法的算術題,有些題他不會做,那麼他會不填答案,有些題可能做錯了。 請你寫個程式,判斷一下小明作對了幾道題?
輸入
每行一個算術式,形如a+b=c,a-b=c,a+b=,a-b=。0≤a,b,c≤100
輸出
輸出正確的題目數。
樣例輸入
1+1=2
1+2=4
2-1=1
2-2=
3+6=
樣例輸出
2

#include<bits/stdc++.h>
using namespace std;

char s[50];

int main(){  
    int d1,d2,d3;
    int cnt=0;
    char op,op2;
    while(gets(s)){
        sscanf(s,"%d%c%d%c%d",&d1,&op,&d2,&op2,&d3);
        switch(op){
            case '+':if(d1+d2==d3)cnt++;break;
            case '-':if(d1-d2==d3)cnt++;break;
        } 
        d3=0x3f3f3f3f;          //無窮大 
        memset(s,0x3f,sizeof(s)); //or memset(s,'\0',sizeof(s);
    }
    printf("%d\n",cnt); 
    return 0;
}
}

Problem C Eason

題目描述
Eason是個非常迷信的人,他喜歡數字3和6,不喜歡4和7。 如果一個數字的數碼中沒有4和7,而有3或者6的話,他就會喜歡這個數字。 比如,他會喜歡13,36,但是不會喜歡14,34。但對於28這種的,他就無所謂喜歡還是不喜歡。 Eason想知道區間[a,b]中一共有多少個他喜歡和不喜歡的數字?
輸入
每行輸入一個樣例,為a和b,0≤a≤b≤106。如果a和b都為0,那麼輸入結束,這個樣例不需要處理。
輸出
每行輸出一個樣例的結果,先輸出喜歡數字的個數,再輸出不喜歡數字的個數
樣例輸入
1 10
1 100
1 1000000
0 0
樣例輸出
2 2
28 36
215488 737856

#include<bits/stdc++.h>
#define N 1000001
using namespace std;

int like[N];
int dislike[N];
int a[N];
int d=0,l=0;

void judge(){
    int m;
    for(int i=0;i<N;i++){
        int flag=0;
        int n=i;
        while(n){
            m=n%10;
            n=n/10;
            if(m==4||m==7){
                flag=1;
                break;
            }
            else if(m==3||m==6){
                flag=-1;
                continue;
            }
            else 
                continue;
        }
        a[i]=flag;
    }
    for(int i=0;i<N;i++){
        if(a[i]==1){
            dislike[i]=++d;
            like[i]=l;
        }
        else if(a[i]==-1){
            dislike[i]=d;
            like[i]=++l;
        }
        else{
            dislike[i]=d;
            like[i]=l;
        }
    }
} 


int main(){
    judge();
    int a,b;
    while(scanf("%d %d",&a,&b)&&a!=0&&b!=0){
        if(a!=0)printf("%d %d\n",like[b]-like[a-1],dislike[b]-dislike[a-1]);
        if(a==0)printf("%d %d\n",like[b],dislike[b]);
    }
    return 0;
}

Problem D 最大子段和

題目描述
給你一個數列a1,a2,…,an,求m個連續數字組成的子段和最大值。
輸入
有多個樣例,每個樣例的第一行是兩個整數n和m,(1≤m≤n;≤100,000)。如果n和m為0表示輸入結束,這個樣例不需要處理。第二行是n個整數ai,0≤ai≤10000。
輸出
每行輸出一個整數,即樣例的結果。
樣例輸入
6 3
1 2 3 4 5 6
6 3
1 2 3 3 2 1
0 0
樣例輸出
15
8

#include<bits/stdc++.h>
#define N 100001

using namespace std;

int a[N];
int s[N];

int main(){
    int m,n;
    while(scanf("%d %d",&n,&m)&&n!=0&&m!=0){
        s[m-1]=0;
        for(int i=0;i<n;i++){
            scanf("%d",&a[i]);
            if(i==m-1){
                for(int j=0;j<m;j++)s[i]+=a[j];
                s[0]=s[i];
            }
            else {
                s[i]=s[i-1]+a[i]-a[i-m];
                if(s[i]>s[0])s[0]=s[i];
            }
        }
        printf("%d\n",s[0]);
    }
    return 0;
}

Problem E ASCII

題目描述
給你一段ASCII編碼的文字,輸出其每個字元的ASCII碼。
輸入
一段文字,由ASCII碼字元組成。
輸出
先輸出行號,行號為16進位制,佔5位,從0開始計數,行號前導為0,然後空一格。 每行最多輸出32個字元的ASCII碼,每個ASCII碼為16進位制,佔2位,前導為0,中間用空格隔開。 所有16進位制使用大寫A~F表示10~15。最後一行行末無空格,無換行。
樣例輸入
ACM International Collegiate Programming Contest,
I LOVE YOU
Lotus is a mystic symbol.
樣例輸出
00000 41 43 4D 20 49 6E 74 65 72 6E 61 74 69 6F 6E 61
00001 6C 20 43 6F 6C 6C 65 67 69 61 74 65 20 50 72 6F
00002 67 72 61 6D 6D 69 6E 67 20 43 6F 6E 74 65 73 74
00003 2C 0A 49 20 4C 4F 56 45 20 59 4F 55 0A 4C 6F 74
00004 75 73 20 69 73 20 61 20 6D 79 73 74 69 63 20 73
00005 79 6D 62 6F 6C 2E 20 0A

#include<bits/stdc++.h>

using namespace std;

char s[10001];

int main(){
    int cnt=0;
    int n=0;
    char a[10001];
    while(gets(a)!=0){
        n=strlen(a);
        for(int i=0;i<n;i++)s[cnt++]=a[i];
        s[cnt++]='\n';
    }
    for(int i=0;i<float(strlen(s)/16.0);i++){
        printf("%05X",i);
        for(int j=0;j<16&&16*i+j<strlen(s);j++)printf(" %02X",s[16*i+j]);
        if(i<=float(strlen(s)/16)-1)printf("\n");
    }
    return 0;
} 

Problem F Tourist 1

題目描述
Eric喜歡旅行,今年暑假終於可以有幾天時間出去玩了。他計劃在去3個不同的城市,而且不想重複去相同的城市,最後回到出發的城市,他想知道怎麼走可以讓差旅費用降到最低? 我們把城市編號為0~3,Eric總從0號城市出發
輸入
第一行是一個整數K,表示樣例的個數。 每個樣例佔4行,每行4個整數Xij,第i行第j列個整數表示從城市i到城市j所需要的旅費,單次費用不超過1000。i = j 時,Xij = 0。
輸出
每行輸出一個樣例的結果,包括兩行,第一行是差旅的總費用,第二行是3個城市的編號序列,每個城市編號之間用一個空格隔開,表示旅行的路線,如果存在多條線路都是最少花費,請輸出字典序輸出這些線路,每個線路一行。
樣例輸入
1
0 1 1 1
2 0 2 2
3 3 0 3
4 4 4 0

樣例輸出
10
1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1

#include<bits/stdc++.h>

using namespace std;

int main(){
    int n;
    int cnt;
    int s[4][4];
    scanf("%d",&n);
    while(n--){
        for(int i=0;i<4;i++){
            for(int j=0;j<4;j++){
                scanf("%d",&s[i][j]);
            }
        }
        int sum=0;
        int min=4001;
        int m[6][3];
        for(int i=1;i<4;i++){
            for(int j=1;j<4;j++){
                if(i==j)continue;
                for(int k=1;k<4;k++){
                    if(k==i||k==j)continue;
                    sum=s[0][i]+s[i][j]+s[j][k]+s[k][0];
                    if(sum>min)continue; 
                    if(sum<min){
                        min=sum;
                        cnt=0;
                        m[cnt][0]=i;
                        m[cnt][1]=j;
                        m[cnt][2]=k;
                        cnt++;
                    }
                    else if(sum==min){
                        m[cnt][0]=i;
                        m[cnt][1]=j;
                        m[cnt][2]=k;
                        cnt++;
                    }
                }
            }
        }
        printf("%d\n",min);
        for(int i=0;i<cnt;i++){
            for(int j=0;j<3;j++){
                printf("%d",m[i][j]);
                if(j<2)printf(" ");
            }
            printf("\n");
        }   
    }
}

Problem G 電話號碼-隱去的字元

題目描述
電視上經常需要顯示使用者的手機號碼,可是一般為了保留使用者的隱私,會將中間的4位數字用“*”代替。
現在給你一個電話號碼,請輸出代替後的電話號碼。
輸入
第一行是一個整數K,表示樣例的個數。 以後每行一個手機號碼,一共11位。
輸出
每行輸出一個結果。
樣例輸入
2
13112345678
13198765432
樣例輸出
131****5678
131****5432

#include<bits/stdc++.h>

using namespace std;

int main(){
    char s[15];
    int n;
    scanf("%d",&n);
    while(n--){
        scanf("%s",&s);
        for(int i=0;i<strlen(s);i++){
            if(i<3||i>6)printf("%c",s[i]);
            else printf("*");
        }
        printf("\n");
    }
    return 0;
} 

Problem H 湘潭大學

題目描述
湘潭大學簡稱“XTU”,作為即將成為湘大的一份子,怎麼不能為湘大添磚加瓦了?現在給你一個字串,請你計算一下,從中選取字元,最多能組成多少個“XTU”?
輸入
第一行是一個整數K,表示樣例的個數。 以後每行一個字串,字串只包含英文大寫字母,長度不會超過1000。
輸出
每行輸出一個樣例的結果。
樣例輸入
3
XTUUTX
ABCDEFGHIJKLMNOPQRSTUVWXTZ
XXXTTT
樣例輸出
2
1
0

#include<bits/stdc++.h>

using namespace std;

int main(){
    int n;
    int x,t,u;
    int m;
    char s[1002];
    scanf("%d",&n);
    while(n--){
        scanf("%s",s);
        x=0;
        t=0;
        u=0;
        for(int i=0;i<strlen(s);i++){
            switch(s[i]){
                case 'X':x++;break;
                case 'T':t++;break; 
                case 'U':u++;break;
            }
        }
        m=min(x,t);
        m=min(m,u);
        printf("%d\n",m);
    }
    return 0;
}

Problem I 勾股數

題目描述
勾股數是指滿足a2+b2=c2的正整數,比如最有名的“勾三股四弦五”。
現在給你兩個正整數,請問是否存在另外一個正整數,使其成為“勾股數”?
輸入
第一行是一個整數K,表示樣例的個數。 以後每行一個樣例,為兩個整數x,y,(1≤x,y≤10000)。
輸出
每行輸出一個樣例的結果。如果不能構成勾股數,輸出“None”,如果存在多個,輸出最小的那個。
樣例輸入
3
3 4
2 6
12 13
樣例輸出
5
None
5

#include<bits\stdc++.h>

using namespace std;

int main(){
    int n;
    int a,b,c,d;
    scanf("%d",&n);
    while(n--){
        scanf("%d %d",&a,&b);
        c=a*a+b*b;
        d=max(a,b)*max(a,b)-min(a,b)*min(a,b);
        //printf("%d %d %d %d\n",c,d,(int)sqrt(c),(int)sqrt(d));
        if(((int)sqrt(c)*(int)sqrt(c)==c)&&((int)sqrt(d)*(int)sqrt(d)==d)&&(c>0)&&(d>0))printf("%d\n",(int)sqrt(d));
        else if((int)sqrt(c)*(int)sqrt(c)==c&&c>0)printf("%d\n",(int)sqrt(c));
        else if((int)sqrt(d)*(int)sqrt(d)==d&&d>0)printf("%d\n",(int)sqrt(d));
        else printf("None\n");
    }
    return 0;
}