NPSC補完計劃

登入註冊帳號.

請輸入帳號, 密碼以及預計登入時間
進階搜尋  

最新消息:

歡迎光臨NPSC補完計劃

+ NPSC補完計劃 » joe59491 的個人資料 » 顯示文章
 主題

顯示文章

這裡允許您檢視這個會員的所有文章。請注意, 您只能看見您有權限閱讀的文章。

主題 - joe59491

頁: [1]
1
NPSC2012國中組決賽 / A、烤餅乾
« 於: 十二月 08, 2012, 10:26:38 pm »
直接硬幹即可?!
代碼: [選擇]
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<algorithm>
#include<cstring>
#include<string>
#include<sstream>
using namespace std;
int chk(int a,int b,int c){
    if(c<a||c<b)return 0;
    if((a+b)<=c)return 0;
    return 1;
    }
int main(){
    int T;
    scanf("%d",&T);
    while(T--){
        int a;
        scanf("%d",&a);
        int ans=0;
        for(int i=1;i<a;i++){
            for(int j=i;j<a;j++){
                    if(chk(i,j,a-i-j))ans++;
                }
            }
        printf("%d\n",ans);
        }
    return 0;
    }

2
NPSC2012國中組決賽 / B、菇菇園
« 於: 十二月 08, 2012, 10:26:01 pm »
用queue來記錄順序
代碼: [選擇]
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<algorithm>
#include<cstring>
#include<string>
#include<sstream>
#include<queue>
using namespace std;
struct co{
    int x,y;
    }c[2005];
int chk[2005],p;
int main(){
    int T;
    scanf("%d",&T);
    while(T--){
        int N,M,K;
        scanf("%d%d%d",&N,&M,&K);
        queue<int>q;
        memset(chk,0,sizeof(chk));p=0;
        for(int i=0;i<N;i++){
            scanf("%d%d",&c[i].x,&c[i].y);
            if(i<M){
                q.push(i);p++;chk[i]=1;
                }
            }
        while(!q.empty()){
            int now=q.front();q.pop();
            for(int i=0;i<N;i++){
                if(((c[i].x-c[now].x)*(c[i].x-c[now].x)+(c[i].y-c[now].y)*(c[i].y-c[now].y))<(K*K)){
                    if(chk[i]==0){
                        q.push(i);chk[i]=1;p++;
                        }
                    }
                }
            }
        printf("%d\n",p);
        }
    return 0;
    }

3
NPSC2012國中組決賽 / C、蚯與地下城
« 於: 十二月 08, 2012, 10:24:48 pm »
DP+DFS?(我其實不確定我怎麼解出來的...)
代碼: [選擇]
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<algorithm>
#include<cstring>
#include<string>
#include<sstream>
#include<list>
using namespace std;
struct node{
    int pay;
    list<int>way;
    }n[1000];
int F(int i){
    list<int>::iterator it;
    int j;
    for(it=n[i].way.begin(),j=0;it!=n[i].way.end();it++,j++){
        if(n[*it].pay>(n[i].pay+j)){
            n[*it].pay=n[i].pay+j;
            F(*it);
            }
        }
    }
int main(){
    int T;
    scanf("%d",&T);
    while(T--){
        int N,M;
        scanf("%d%d",&N,&M);
        for(int i=0;i<N;i++){
            n[i].pay=0x7FFFFFFF;
            n[i].way.clear();
            }
        for(int i=0;i<M;i++){
            int a,b;
            scanf("%d%d",&a,&b);
            n[a-1].way.push_back(b-1);
            }
        for(int i=0;i<N;i++){
            n[i].way.sort();
            }
        n[0].pay=0;
        F(0);
        printf("%d\n",n[N-1].pay==0x7FFFFFFF?-1:n[N-1].pay);
        }
    return 0;
    }

4
NPSC2012國中組決賽 / D、蚯蚓王
« 於: 十二月 08, 2012, 10:23:08 pm »
這其實先排序過後再解會更好...(不用map)
代碼: [選擇]
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<algorithm>
#include<cstring>
#include<string>
#include<sstream>
#include<map>
using namespace std;
int nlis[2000],p;
int main(){
    int T;
    scanf("%d",&T);
    while(T--){
        int N,tmp;
        scanf("%d",&N);p=0;
        map<int,int> tlis;
        for(int i=0;i<N;i++){
            scanf("%d",&tmp);
            if(tlis[tmp]==0){
                nlis[p]=tmp;
                p++;
                tlis[tmp]=1;
                }
            else{
                tlis[tmp]++;
                }
            }
        int ans=-1;
        for(int i=0;i<p;i++){
            if(tlis[nlis[i]]>(N>>1))ans=nlis[i];
            }
        printf("%d\n",ans);
        }
    return 0;
    }

5
NPSC2012國中組決賽 / E、黑與白
« 於: 十二月 08, 2012, 10:22:00 pm »
這題就一身高排序後,算一下就過了
代碼: [選擇]
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<algorithm>
#include<cstring>
#include<string>
#include<sstream>
using namespace std;
struct people{
       int h,c;
       }p[1000];
bool cmp(people a,people b){
    if(a.h>b.h)return 1;
    return 0;
    }
int main(){
    int T;
    scanf("%d",&T);
    while(T--){
        int N,tb=0;
        scanf("%d",&N);
        for(int i=0;i<N;i++){
            scanf("%d%d",&p[i].h,&p[i].c);
            if(p[i].c)tb++;
            }
        int ans=0;
        sort(p,p+N,cmp);
        int hb=0,hw=0,eb=tb,ew=N-tb;
        for(int i=0;i<N-1;i++){
            if(p[i].c==0)hw++,ew--;
            if(p[i].c==1)hb++,eb--;
            if(p[i].h!=p[i+1].h){
                if((ew+hb)>ans)ans=ew+hb;
                if((eb+hw)>ans)ans=eb+hw;
                }
            }
        printf("%d\n",ans);
        }
    return 0;
    }

6
NPSC2012國中組決賽 / F、社群網路
« 於: 十二月 08, 2012, 10:16:03 pm »
這題我是把每個點的邊都找兩個兩個來檢查
代碼: [選擇]
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<algorithm>
#include<cstring>
#include<string>
#include<sstream>
#include<list>
using namespace std;
int ls[300][300];
int gcd(int a,int b){
    while(b!=0){
        a%=b;
        swap(a,b);
        }
    return a;
    }
int main(){
    int T;
    scanf("%d",&T);
    while(T--){
        list<int>lis[300];
        list<int>::iterator it1,it2;
        memset(ls,0,sizeof(ls));
        int N,M;
        scanf("%d%d",&N,&M);
        int tri=0,lin=0;
        for(int i=0;i<M;i++){
            int a,b;
            scanf("%d%d",&a,&b);
            lis[a-1].push_back(b-1);
            lis[b-1].push_back(a-1);
            ls[a-1][b-1]=1;
            ls[b-1][a-1]=1;
            }
        for(int i=0;i<N;i++){
            for(it1=lis[i].begin();it1!=lis[i].end();it1++){
                for(it2=it1,it2++;it2!=lis[i].end();it2++){
                    lin++;
                    if(ls[*it1][*it2])tri++;
                    }
                }
            }
        int g=gcd(tri,lin);
        printf("%d/%d\n",tri/g,lin/g);
        }
    return 0;
    }

7
NPSC2012國中組決賽 / G、蚯蚓的卡片
« 於: 十二月 08, 2012, 10:14:26 pm »
這題我覺得根本是在找bug花了一大堆時間...(換行和空格就夠麻煩了...)
我的解法是開個大陣列,從中間開始填,填完後再填空白。
代碼: [選擇]
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<algorithm>
#include<cstring>
#include<string>
#include<sstream>
using namespace std;
char map[1000][1000];
char s[10000];
int main(){
    int T;
    scanf("%d",&T);
    while(T--){
        scanf("%s",s);
        memset(map,0,sizeof(map));
        int len=strlen(s),x=500,y=500,v=4;//1 right , 2 left , 3 up , 4 down
        for(int i=0;i<len;i++){
            map[y][x]=s[i];
            if(v==1){
                if(map[y-1][x]==0)v=3,y--;
                else x++;
                }
            else if(v==2){
                if(map[y+1][x]==0)v=4,y++;
                else x--;
                }
            else if(v==3){
                if(map[y][x-1]==0)v=2,x--;
                else y--;
                }
            else if(v==4){
                if(map[y][x+1]==0)v=1,x++;
                else y++;
                }
            }
        int sx=500,sy=500,ex=500,ey=500;
        for(int i=0;i<1000;i++){
            for(int j=0;j<1000;j++){
                if(map[i][j]!=0){
                    if(i<sx){sx=i;}
                    if(i>ex){ex=i;}
                    if(j<sy){sy=j;}
                    if(j>ey){ey=j;}
                    }
                }
            }
        for(int i=sx;i<=ex;i++){
            for(int j=sy;j<ey;j++){
                if(map[i][j]=='\0'){
                    map[i][j]=' ';
                    }
                else break;
                }
            }
        for(int i=sx;i<=ex;i++){
            printf("%s\n",map[i]+sy);
            }
        puts("");
        }
    return 0;
    }

8
綜合討論區 / 無言中...
« 於: 十二月 10, 2011, 11:15:34 pm »
這次NPSC的題目回家後,仔細看看,發現錯了很多很白痴的東西...
有的是題目沒看清楚;
有個是題目想到別的東西去了;
有的是搞錯題目的意思.
解果只解了兩題...落得沒進前三的下場...

9
NPSC2011國中組決賽 / F、田忌賽馬外傳
« 於: 十二月 10, 2011, 11:07:30 pm »
這題,好像有在我的國文參考書上出現過,而在寫國文時有仔細想過,所以解比較快...(這不是重點)。
回到正題,這題就是先排序好,我方挑最好的N匹馬,敵方挑最爛的N匹馬,然後比較

程式碼:
代碼: [選擇]
#include<stdio.h>
#include<iostream>
#include<algorithm>
using namespace std;
int me[2000000],he[2000000];
int main(){
    int a,b,c,d,e,g,h,i,j,k,l,f;
    scanf("%d",&a);
    for(b=0;b<a;b++){
scanf("%d%d",&c,&d);
for(e=0;e<c;e++){
scanf("%d",&me[e]);
}
for(e=0;e<c;e++){
scanf("%d",&he[e]);
}
sort(&me[0],&me[c]);
sort(&he[0],&he[c]);
f=0;
for(e=0;e<d;e++){
if(me[e+(c-d)]<=he[e]){if(f<(he[e]-me[e+(c-d)]+1)){f=(he[e]-me[e+(c-d)]+1);}}
}
printf("%d\n",f);
}
    return 0;
    }

10
NPSC2011國中組決賽 / E、天王星計畫
« 於: 十二月 10, 2011, 11:02:19 pm »
這題我是用先建一張到每個地點最小需要光束的圖,然後再取出來就好了。
沒有想到光束可以用在距離為二且差小於2D時,可以放在中間踩著它跳過去...

程式碼:
代碼: [選擇]
#include<stdio.h>
#include<iostream>
#include<stdlib.h>
#include<algorithm>
using namespace std;
int map[500][500];
int mmap[500][500];
int main(){
    int a,b,c,d,e,f,g,h,i,j,k,l;
    int mx,my,bx,by,D,x,y;
    scanf("%d",&a);
    for(b=0;b<a;b++){
scanf("%d%d%d%d%d%d%d",&x,&y,&mx,&my,&bx,&by,&D);
mx--;my--;bx--;by--;
for(c=0;c<y;c++){
for(d=0;d<x;d++){
scanf("%d",&map[c][d]);
}
}
for(c=0;c<y;c++){
for(d=0;d<x;d++){
mmap[c][d]=99999999;
}
}
mmap[my][mx]=0;
for(l=0;l<1000;l++){
for(c=0;c<y;c++){
for(d=0;d<x;d++){
if(mmap[c][d]!=99999999){
if(c+1<y){
g=map[c+1][d]-map[c][d];
if(g<0){g*=-1;}
if(g>D){h=1+mmap[c][d];}
else{h=mmap[c][d];}
if(h<mmap[c+1][d]){mmap[c+1][d]=h;}
}
if(c-1>=0){
g=map[c-1][d]-map[c][d];
if(g<0){g*=-1;}
if(g>D){h=1+mmap[c][d];}
else{h=mmap[c][d];}
if(h<mmap[c-1][d]){mmap[c-1][d]=h;}
}
if(d+1<x){
g=map[c][d+1]-map[c][d];
if(g<0){g*=-1;}
if(g>D){h=1+mmap[c][d];}
else{h=mmap[c][d];}
if(h<mmap[c][d+1]){mmap[c][d+1]=h;}
}
if(d-1>=0){
g=map[c][d-1]-map[c][d];
if(g<0){g*=-1;}
if(g>D){h=1+mmap[c][d];}
else{h=mmap[c][d];}
if(h<mmap[c][d-1]){mmap[c][d-1]=h;}
}

//以下是我決賽忘解寫的地方...

if(c+1<y&&d+1<x){
g=map[c+1][d+1]-map[c][d];
if(g<0){g*=-1;}
if(g<=2*D){h=1+mmap[c][d];}
else{h=99999999;}
if(h<mmap[c+1][d+1]){mmap[c+1][d+1]=h;}
}

if(c+1<y&&d-1>=0){
g=map[c+1][d-1]-map[c][d];
if(g<0){g*=-1;}
if(g<=2*D){h=1+mmap[c][d];}
else{h=99999999;}
if(h<mmap[c+1][d-1]){mmap[c+1][d-1]=h;}
}

if(c-1>=0&&d+1<x){
g=map[c-1][d+1]-map[c][d];
if(g<0){g*=-1;}
if(g<=2*D){h=1+mmap[c][d];}
else{h=99999999;}
if(h<mmap[c-1][d+1]){mmap[c-1][d+1]=h;}
}

if(c-1>=0&&d-1>=0){
g=map[c-1][d-1]-map[c][d];
if(g<0){g*=-1;}
if(g<=2*D){h=1+mmap[c][d];}
else{h=99999999;}
if(h<mmap[c-1][d-1]){mmap[c-1][d-1]=h;}
}

if(c+2<y){
g=map[c+2][d]-map[c][d];
if(g<0){g*=-1;}
if(g<=2*D){h=1+mmap[c][d];}
else{h=99999999;}
if(h<mmap[c+2][d]){mmap[c+2][d]=h;}
}

if(c-2>=0){
g=map[c-2][d]-map[c][d];
if(g<0){g*=-1;}
if(g<=2*D){h=1+mmap[c][d];}
else{h=99999999;}
if(h<mmap[c-2][d]){mmap[c-2][d]=h;}
}

if(d+2<x){
g=map[c][d+2]-map[c][d];
if(g<0){g*=-1;}
if(g<=2*D){h=1+mmap[c][d];}
else{h=99999999;}
if(h<mmap[c][d+2]){mmap[c][d+2]=h;}
}

if(d-2>=0){
g=map[c][d-2]-map[c][d];
if(g<0){g*=-1;}
if(g<=2*D){h=1+mmap[c][d];}
else{h=99999999;}
if(h<mmap[c][d-2]){mmap[c][d-2]=h;}
}

//到此為止

}
}
}
}

printf("%d\n",mmap[by][bx]);

}

    return 0;
    }

11
NPSC2011國中組決賽 / D、簡單題的逆襲
« 於: 十二月 10, 2011, 10:52:06 pm »
這題因為A,B,C越平均越好,所以又先算總和的三分之一,在分別從前跟後找出最接近三分之一的總和,把那附近的值試一下,就行了!   果真是『簡單題』的逆襲

程式碼:
代碼: [選擇]
#include<stdio.h>
#include<iostream>
#include<stdlib.h>
#include<math.h>
using namespace std;

double area(int A,int B,int C){
double S=((double)(A+B+C))/2;
return sqrt(S*(S-(double)A)*(S-(double)B)*(S-(double)C));
}
int main(){
    int a,b,c,d,e,f,g,h,i,j,k,l,dou,total,doub,ar[200];
    double A,tot,doubl;
    scanf("%d",&a);
    for(b=0;b<a;b++){
scanf("%d",&c);total=0;
for(d=0;d<c;d++){
scanf("%d",&ar[d]);
total+=ar[d];
}
tot=((double)total)/3;//找三段平均
dou=0;
for(d=0;d<c;d++){
dou+=ar[d];
if((double)dou>=tot){break;}
}
i=d;
doub=0;
for(d=c-1;d>i;d--){
doub+=ar[d];
if(d==i+1){break;}
if((double)doub>=tot){break;}
}
j=d;
A=0;
doubl=area(dou,total-dou-doub,doub);
if(doubl>A){A=doubl;}
doubl=area(dou-ar[i],total-dou-doub+ar[i],doub);
if(doubl>A){A=doubl;}
doubl=area(dou,total-dou-doub+ar[j],doub-ar[j]);
if(doubl>A){A=doubl;}
doubl=area(dou-ar[i],total-dou-doub+ar[j]+ar[i],doub-ar[j]);
if(doubl>A){A=doubl;}
printf("%.2lf\n",A);
}
    return 0;
    }

12
NPSC2011國中組決賽 / C、圈圈國
« 於: 十二月 10, 2011, 10:12:48 pm »
在最後公布解答時,給了個怪怪的解法(找和的眾數)...寫出來長這樣

程式碼:
代碼: [選擇]
#include<stdio.h>
#include<iostream>
#include<stdlib.h>
#include<algorithm>
using namespace std;
int ar[20000];
int arr[20002];
int main(){
    int a,b,c,d,e,f,g,h,i,j,k,l,m,n;
    scanf("%d",&a);
    for(b=0;b<a;b++){
    scanf("%d",&c);
    for(d=0;d<c;d++){
scanf("%d",&ar[d]);
}l=0;
for(d=0;d<c;d++){
l+=ar[d];
arr[d]=l;
}
sort(&arr[0],&arr[c]);
k=0;l=0;m=arr[0];
for(d=0;d<c;d++){
if(m==arr[d]){k++;}
else{
k=1;m=arr[d];
}
if(k>l){l=k;}
}
printf("%d\n",l);
}
    return 0;
    }

13
NPSC2011國中組決賽 / A、賓果遊戲
« 於: 十二月 10, 2011, 09:52:17 pm »
超級麻煩的模擬題...比圈叉棋的程式麻煩太多了...廢話不多說了,看程式碼吧...

程式碼:
代碼: [選擇]
#include<stdio.h>
#include<iostream>
#include<stdlib.h>
#include<algorithm>
using namespace std;
int map[2][5][5];
int ar[25];
int x,y;
int see(int a,int d){
int b,c;
for(b=0;b<5;b++){
for(c=0;c<5;c++){
if(map[d][b][c]==a){x=b;y=c;return 0;}
}
}
}
int main(){
    int a,b,c,d,e,f,g,h,i,j,k,l;
    scanf("%d",&a);
    for(b=0;b<a;b++){
for(c=0;c<5;c++){
for(d=0;d<5;d++){
scanf("%d",&map[0][c][d]);
}
}

for(c=0;c<5;c++){
for(d=0;d<5;d++){
scanf("%d",&map[1][c][d]);
}
}
for(c=0;c<25;c++){
scanf("%d",&ar[c]);
}g=0;
for(c=0;c<25;c++){
see(ar[c],0);
map[0][x][y]=-1;
see(ar[c],1);
map[1][x][y]=-1;


i=0;j=0;

for(d=0;d<5;d++){
if(map[0][d][0]==-1&&map[0][d][1]==-1&&map[0][d][2]==-1&&map[0][d][3]==-1&&map[0][d][4]==-1){i=1;}
if(map[0][0][d]==-1&&map[0][1][d]==-1&&map[0][2][d]==-1&&map[0][3][d]==-1&&map[0][4][d]==-1){i=1;}
}
if(map[0][0][0]==-1&&map[0][1][1]==-1&&map[0][2][2]==-1&&map[0][3][3]==-1&&map[0][4][4]==-1){i=1;}
if(map[0][0][4]==-1&&map[0][1][3]==-1&&map[0][2][2]==-1&&map[0][3][1]==-1&&map[0][4][0]==-1){i=1;}

for(d=0;d<5;d++){
if(map[1][d][0]==-1&&map[1][d][1]==-1&&map[1][d][2]==-1&&map[1][d][3]==-1&&map[1][d][4]==-1){j=1;}
if(map[1][0][d]==-1&&map[1][1][d]==-1&&map[1][2][d]==-1&&map[1][3][d]==-1&&map[1][4][d]==-1){j=1;}
}
if(map[1][0][0]==-1&&map[1][1][1]==-1&&map[1][2][2]==-1&&map[1][3][3]==-1&&map[1][4][4]==-1){j=1;}
if(map[1][0][4]==-1&&map[1][1][3]==-1&&map[1][2][2]==-1&&map[1][3][1]==-1&&map[1][4][0]==-1){j=1;}
if(i==1&&j==1){g=1;printf("0\n");break;}
if(i==1&&j==0){g=1;printf("1\n");break;}
if(i==0&&j==1){g=1;printf("2\n");break;}
}
if(g==0){printf("0\n");}

}
    return 0;
    }

14
NPSC2008國中組決賽 / G. Poker
« 於: 十二月 04, 2011, 10:35:55 pm »
這題就...直接看程式碼好了(太長,不適合描述)...主要就用一堆手算算出來的...

程式碼:
代碼: [選擇]
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
struct card{
    int point;
    int color;
};
struct player{
    card c0;
    card c1;
    card c2;
    card c3;
    card c4;
    int group;
    int f1;
    int f2;
    int f3;
    int f4;
    int f5;
};
typedef int (*compfn)(const void*, const void*);

int cardcompare(struct card *c1, struct card *c2){
    if(c1->point<c2->point){return 1;}
    if(c1->point==c2->point&&c1->point>c2->point){return 1;}
return 0;
}

char s[5];
player p[2];
card c[5];
int getcard(int a,char b,char d){//處理卡片的輸入
        if(b=='2'){c[a].point=2;}
        if(b=='3'){c[a].point=3;}
        if(b=='4'){c[a].point=4;}
        if(b=='5'){c[a].point=5;}
        if(b=='6'){c[a].point=6;}
        if(b=='7'){c[a].point=7;}
        if(b=='8'){c[a].point=8;}
        if(b=='9'){c[a].point=9;}
        if(b=='T'){c[a].point=10;}
        if(b=='J'){c[a].point=11;}
        if(b=='Q'){c[a].point=12;}
        if(b=='K'){c[a].point=13;}
        if(b=='A'){c[a].point=14;}
        if(d=='S'){c[a].color=0;}
        if(d=='H'){c[a].color=1;}
        if(d=='D'){c[a].color=2;}
        if(d=='C'){c[a].color=3;}
    }
int groupcard(int a){//算出卡片的情況....蠻暴力的...
    /*
    ~~~ ->group號碼
    無對: 以點數最高的牌為比較。->0
    一對: 有兩張相同點數的牌。->1
    兩對: 有兩組相同點數的牌各兩張。->2
    三條: 有三張一樣點數的牌。->3
    順子: 五張順連的牌。->4
    同花: 五張同一花色的牌。->5
    葫蘆: 有三張一樣點數的牌,再加上另外兩點點數一樣的牌。->6
    四條: 有四張一樣點數的牌。->7
    同花順: 有同一花色又順連的牌。->8
    */
    p[a].f1=0; p[a].f2=0; p[a].f3=0; p[a].f4=0; p[a].f5=0;
    if(p[a].c0.point-p[a].c1.point==1&&p[a].c1.point-p[a].c2.point==1&&p[a].c2.point-p[a].c3.point==1&&p[a].c3.point-p[a].c4.point==1){
        if(p[a].c0.color==p[a].c1.color&&p[a].c1.color==p[a].c2.color&&p[a].c2.color==p[a].c3.color&&p[a].c3.color==p[a].c4.color){p[a].f1=p[a].c0.point;p[a].group=8;}
        else{p[a].f1=p[a].c0.point;p[a].group=4;}
        }
    else if(p[a].c0.point==14&&p[a].c1.point==5&&p[a].c2.point==4&&p[a].c3.point==3&&p[a].c4.point==2){
        if(p[a].c0.color==p[a].c1.color&&p[a].c1.color==p[a].c2.color&&p[a].c2.color==p[a].c3.color&&p[a].c3.color==p[a].c4.color){p[a].f1=p[a].c1.point;p[a].group=8;}
        else{p[a].f1=p[a].c1.point;p[a].group=4;}
        }
    else if(p[a].c0.point-p[a].c1.point==0&&p[a].c1.point-p[a].c2.point==0&&p[a].c2.point-p[a].c3.point==0){p[a].f1=p[a].c0.point; p[a].f2=p[a].c4.point;p[a].group=7;}
    else if(p[a].c4.point-p[a].c1.point==0&&p[a].c1.point-p[a].c2.point==0&&p[a].c2.point-p[a].c3.point==0){p[a].f1=p[a].c1.point; p[a].f2=p[a].c0.point;p[a].f1=p[a].c1.point;p[a].group=7;}
    else if(p[a].c0.point-p[a].c1.point==0&&p[a].c1.point-p[a].c2.point==0&&p[a].c3.point-p[a].c4.point==0){p[a].f1=p[a].c0.point; p[a].f2=p[a].c4.point;p[a].group=6;}
    else if(p[a].c0.point-p[a].c1.point==0&&p[a].c2.point-p[a].c3.point==0&&p[a].c3.point-p[a].c4.point==0){p[a].f1=p[a].c4.point; p[a].f2=p[a].c0.point;p[a].group=6;}
    else if(p[a].c0.color==p[a].c1.color&&p[a].c1.color==p[a].c2.color&&p[a].c2.color==p[a].c3.color&&p[a].c3.color==p[a].c4.color){p[a].f1=p[a].c0.point; p[a].f2=p[a].c1.point; p[a].f3=p[a].c2.point; p[a].f4=p[a].c3.point; p[a].f5=p[a].c4.point; p[a].group=5;}
    else if(p[a].c0.point-p[a].c1.point==0&&p[a].c1.point-p[a].c2.point==0){p[a].f1=p[a].c0.point; p[a].f2=p[a].c3.point; p[a].f3=p[a].c4.point; p[a].group=3;}
    else if(p[a].c1.point-p[a].c2.point==0&&p[a].c2.point-p[a].c3.point==0){p[a].f1=p[a].c1.point; p[a].f2=p[a].c0.point; p[a].f3=p[a].c4.point; p[a].group=3;}
    else if(p[a].c2.point-p[a].c3.point==0&&p[a].c3.point-p[a].c4.point==0){p[a].f1=p[a].c2.point; p[a].f2=p[a].c0.point; p[a].f3=p[a].c1.point; p[a].group=3;}
    else if(p[a].c0.point-p[a].c1.point==0&&p[a].c2.point-p[a].c3.point==0){p[a].f1=p[a].c0.point; p[a].f2=p[a].c2.point; p[a].f3=p[a].c4.point; p[a].group=2;}
    else if(p[a].c1.point-p[a].c2.point==0&&p[a].c3.point-p[a].c4.point==0){p[a].f1=p[a].c1.point; p[a].f2=p[a].c3.point; p[a].f3=p[a].c0.point; p[a].group=2;}
    else if(p[a].c0.point-p[a].c1.point==0&&p[a].c3.point-p[a].c4.point==0){p[a].f1=p[a].c0.point; p[a].f2=p[a].c3.point; p[a].f3=p[a].c2.point; p[a].group=2;}
    else if(p[a].c0.point-p[a].c1.point==0){p[a].f1=p[a].c0.point; p[a].f2=p[a].c2.point; p[a].f3=p[a].c3.point; p[a].f4=p[a].c4.point; p[a].group=1;}
    else if(p[a].c1.point-p[a].c2.point==0){p[a].f1=p[a].c1.point; p[a].f2=p[a].c0.point; p[a].f3=p[a].c3.point; p[a].f4=p[a].c4.point; p[a].group=1;}
    else if(p[a].c2.point-p[a].c3.point==0){p[a].f1=p[a].c2.point; p[a].f2=p[a].c0.point; p[a].f3=p[a].c1.point; p[a].f4=p[a].c4.point; p[a].group=1;}
    else if(p[a].c3.point-p[a].c4.point==0){p[a].f1=p[a].c3.point; p[a].f2=p[a].c0.point; p[a].f3=p[a].c1.point; p[a].f4=p[a].c2.point; p[a].group=1;}
    else{p[a].f1=p[a].c0.point; p[a].f2=p[a].c1.point; p[a].f3=p[a].c2.point; p[a].f4=p[a].c3.point; p[a].f5=p[a].c4.point; }
    return 0;
    }
int main()
{
    int a,b,d,e,f,g,h,i,j,k;

    scanf("%d",&a);
    for(b=0;b<a;b++){
        scanf("%s",s);
        getcard(0,s[0],s[1]);
        scanf("%s",s);
        getcard(1,s[0],s[1]);
        scanf("%s",s);
        getcard(2,s[0],s[1]);
        scanf("%s",s);
        getcard(3,s[0],s[1]);
        scanf("%s",s);
        getcard(4,s[0],s[1]);
qsort(c,5,sizeof(struct card),(compfn)cardcompare );
p[0].c0=c[0];
p[0].c1=c[1];
p[0].c2=c[2];
p[0].c3=c[3];
p[0].c4=c[4];


        scanf("%s",s);
        getcard(0,s[0],s[1]);
        scanf("%s",s);
        getcard(1,s[0],s[1]);
        scanf("%s",s);
        getcard(2,s[0],s[1]);
        scanf("%s",s);
        getcard(3,s[0],s[1]);
        scanf("%s",s);
        getcard(4,s[0],s[1]);
qsort(c,5,sizeof(struct card),(compfn)cardcompare );
p[1].c0=c[0];
p[1].c1=c[1];
p[1].c2=c[2];
p[1].c3=c[3];
p[1].c4=c[4];
g=1;
p[0].group=0;
p[1].group=0;
groupcard(0);
groupcard(1);
if(p[0].group>p[1].group){printf("Win\n");}
else if(p[0].group<p[1].group){printf("Lose\n");}
else{
if(p[0].f1>p[1].f1){printf("Win\n");}
else if(p[0].f1<p[1].f1){printf("Lose\n");}
else if(p[0].f2>p[1].f2){printf("Win\n");}
else if(p[0].f2<p[1].f2){printf("Lose\n");}
else if(p[0].f3>p[1].f3){printf("Win\n");}
else if(p[0].f3<p[1].f3){printf("Lose\n");}
else if(p[0].f4>p[1].f4){printf("Win\n");}
else if(p[0].f4<p[1].f4){printf("Lose\n");}
else if(p[0].f5>p[1].f5){printf("Win\n");}
else if(p[0].f5<p[1].f5){printf("Lose\n");}
else{printf("Lose\n");}
}
}
return 0;
}

15
NPSC2011國中組初賽 / F、數據解密
« 於: 十一月 26, 2011, 08:22:28 pm »
這題只要判斷數字的一些部位就好了,不需要整個數字全部判斷,如四只要判斷上面開,下面開,就行了。

程式碼:

代碼: [選擇]
#include <iostream>
#include <stdio.h>
#include <string>
#include <stdlib.h>
using namespace std;
int main(){
    int a,b,c,d,e,f,g,h,i,j;
    string s[5],ss;
    scanf("%d",&a);
    for(b=0;b<a;b++){
    cin>>s[0];
    cin>>s[1];
    cin>>s[2];
    cin>>s[3];
    cin>>s[4];
    ss="";j=0;i=0;
    for(c=0;c<s[0].length();c++){
if(s[0][c]=='#'){
if(s[0][c+1]!='#'&&s[4][c+1]!='#'&&s[1][c]=='#'&&s[3][c]=='#'&&s[2][c+1]!='#'){ss+="1";c+=1;i*=10;i+=1;}//1
else if(s[0][c+1]=='#'&&s[4][c+1]=='#'&&s[1][c]!='#'&&s[3][c]=='#'&&s[2][c+1]=='#'){ss+="2";c+=3;i*=10;i+=2;}//2
else if(s[0][c+1]=='#'&&s[4][c+1]=='#'&&s[1][c]!='#'&&s[3][c]!='#'&&s[2][c+1]=='#'){ss+="3";c+=3;i*=10;i+=3;}//3
else if(s[0][c+1]!='#'&&s[4][c+1]!='#'&&s[1][c]=='#'&&s[3][c]!='#'&&s[2][c+1]=='#'){ss+="4";c+=3;i*=10;i+=4;}//4
else if(s[0][c+1]=='#'&&s[4][c+1]=='#'&&s[1][c]=='#'&&s[3][c]!='#'&&s[1][c+2]!='#'){ss+="5";c+=3;i*=10;i+=5;}//5
else if(s[0][c+1]=='#'&&s[4][c+1]=='#'&&s[1][c]=='#'&&s[3][c]=='#'&&s[1][c+2]!='#'){ss+="6";c+=3;i*=10;i+=6;}//6
else if(s[0][c+1]=='#'&&s[4][c+1]!='#'&&s[1][c]=='#'&&s[3][c]!='#'&&s[2][c+1]!='#'){ss+="7";c+=3;i*=10;i+=7;}//7
else if(s[0][c+1]=='#'&&s[4][c+1]=='#'&&s[1][c]=='#'&&s[3][c]=='#'&&s[2][c+1]=='#'){ss+="8";c+=3;i*=10;i+=8;}//8
else if(s[0][c+1]=='#'&&s[4][c+1]=='#'&&s[1][c]=='#'&&s[3][c]!='#'&&s[1][c+2]=='#'){ss+="9";c+=3;i*=10;i+=9;}//9
else if(s[0][c+1]=='#'&&s[4][c+1]=='#'&&s[1][c]=='#'&&s[3][c]=='#'&&s[2][c+1]!='#'){ss+="0";c+=3;i*=10;i+=0;}//0

}
if(s[0][c]!='#'){
if(s[1][c+1]=='#'&&s[2][c+1]=='#'&&s[2][c]=='#'&&s[2][c+2]=='#'&&s[3][c+1]=='#'){ss+="+";c+=3;j+=i;i=0;}//1
}
}
j+=i;i=0;
//cout<<ss<<endl;    //這是印出式子
printf("%d\n",j);
}
   return 0;
}

16
NPSC2011國中組初賽 / E、守塔新武器
« 於: 十一月 26, 2011, 08:19:34 pm »
這題勒...就先用1+2+4+8...加到超過,再從最大的值加回來,加到剛好時就跳出(注意long long int)。

程式碼:
代碼: [選擇]
#include <iostream>
#include <stdio.h>
#include <string>
#include <stdlib.h>
using namespace std;
int map[200000];
int main(){
    int a,b,c,d,e,f,g,h,i,j,k;
    long long lld,ld;
    string s,ss;
    scanf("%d",&a);
    for(c=0;c<a;c++){
    scanf("%I64d",&lld);
    //scanf("%lld",&lld);    //這是zerojudge上用的
    long long int l;
    ld=0;i=0;
for(l=1;l<99999999999LL;l*=2){i++;
    ld+=l;
if(ld>lld){i--;ld-=l;break;}
}
    for(;l>=1LL;l/=2){
for(k=0;k<10000;k++){
ld+=l;i++;
if(ld>lld){i--;ld-=l;break;}
}
}
printf("%d\n",i);
}
   return 0;
}

17
NPSC2011國中組初賽 / D、滿州皇帝之璽
« 於: 十一月 26, 2011, 08:15:45 pm »
這題就先把做出四種方向的玉璽,再分別慢慢蓋就好了

程式碼:
代碼: [選擇]
#include <iostream>
#include <stdio.h>
#include <string>
#include <stdlib.h>
#include <sstream>
using namespace std;
char wall[100][100];
string usi[4][100];//四方+100行
int main(){
    int a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p;
    scanf("%d",&a);
    for(b=0;b<a;b++){
    scanf("%d%d%d",&e,&f,&g);
    for(c=0;c<e;c++){
for(d=0;d<e;d++){
wall[c][d]='.';
}
}
for(c=0;c<f;c++){
usi[0][c]="";
usi[1][c]="";
usi[2][c]="";
usi[3][c]="";
}
for(c=0;c<f;c++){//方向0
cin>>usi[0][c];
}
for(c=0;c<f;c++){//方向1
for(d=0;d<f;d++){
usi[1][c]+=usi[0][f-d-1][c];
}
}
for(c=0;c<f;c++){//方向2
for(d=0;d<f;d++){
usi[2][c]+=usi[0][f-c-1][f-d-1];
}
}
for(c=0;c<f;c++){//方向3
for(d=0;d<f;d++){
usi[3][c]+=usi[0][d][f-c-1];
}
}
for(c=0;c<g;c++){
scanf("%d%d%d",&i,&j,&k);
for(m=i;m<i+f;m++){
for(n=j;n<j+f;n++){
if(m>=0&&n>=0&&m<99&&n<99){
if(usi[k][m-i][n-j]=='#'){
wall[m][n]='#';
}
}
}
}
}
    for(c=0;c<e;c++){
for(d=0;d<e;d++){
cout<<wall[c][d];
}
printf("\n");
}
}
   return 0;
}
這題因當初時間不足,來不及送出(殘念...),所以可能有bug...
// 2011/12/05 --發現一個小錯誤,已更正。

18
NPSC2011國中組初賽 / C、導覽形機器人
« 於: 十一月 26, 2011, 08:12:10 pm »
這題就只要『小心』就好了...
我先找出0的位置,再從那點找出周圍可以走的點...

程式碼:
代碼: [選擇]
#include <iostream>
#include <stdio.h>
#include <string>
#include <stdlib.h>
#include <sstream>
using namespace std;
int map[1000][1000];
int main(){
    int a,b,c,d,e,f,g,h,i,j,k,l,m;
    string s,ss;
    scanf("%d",&a);
    for(b=0;b<a;b++){
scanf("%d%d",&c,&d);
for(e=0;e<100;e++){
for(f=0;f<100;f++){
map[e][f]=-1;
}
}
for(e=1;e<c+1;e++){
for(f=1;f<d+1;f++){
scanf("%d",&map[e][f]);
}
}
int x,y,n=0;
for(e=1;e<c+1;e++){
for(f=1;f<d+1;f++){
if(map[e][f]==0){x=e,y=f;}
}
}
s="";
while(1){
if(map[x+1][y]==n+1){s+="S";x++;}
else if(map[x-1][y]==n+1){s+="N";x--;}
else if(map[x][y+1]==n+1){s+="E";y++;}
else if(map[x][y-1]==n+1){s+="W";y--;}
else{break;}
n++;
}
ss="";s+=" ";
char ch=s[0];
int p=0;
for(e=0;e<s.length();e++){
if(s[e]!=ch){cout<<ch<<p;ch=s[e];p=1;}
else{p++;}
}
printf("\n");
}
   return 0;
}

19
NPSC2011國中組初賽 / B、街道國
« 於: 十一月 26, 2011, 08:08:15 pm »
看懂題目最重要...
注意『街道國中的水井不多不少剛好可以供給全國的國民使用』(漏了這句就很難解...),一個一個加起來,加到有0時就可斷開.

程式碼:
代碼: [選擇]
#include <iostream>
#include <stdio.h>
#include <string>
#include <stdlib.h>
using namespace std;
int map[200000];
int main(){
    int a,b,c,d,e,f,g,h,i,j,k,l,m;
    scanf("%d",&a);
    for(b=0;b<a;b++){
    scanf("%d",&c);
for(d=0;d<c;d++){
scanf("%d",&map[d]);
}
e=0;f=0;
for(d=0;d<c;d++){
e+=map[d];
if(e==0){f++;}
}
printf("%d\n",f);
}
   return 0;
}

20
NPSC2011國中組初賽 / A、百年國慶
« 於: 十一月 26, 2011, 08:04:00 pm »
這提就是先輸入第一張圖,然後再把剩餘的比較...

程式碼:
代碼: [選擇]
#include <iostream>
#include <stdio.h>
#include <string>
#include <stdlib.h>
using namespace std;
int map[10][10],mop[10][10];
int main(){
    int a,b,c,d,e,f,g,h,i,j,k,l,m;
    string s,ss;
    scanf("%d",&a);
    for(c=0;c<5;c++){
for(d=0;d<5;d++){
scanf("%d",&mop[c][d]);
}
}
    for(b=0;b<a-1;b++){
    l=0;
    for(c=0;c<5;c++){
for(d=0;d<5;d++){
scanf("%d",&map[c][d]);
}
}
    for(c=0;c<5;c++){
for(d=0;d<5;d++){
if(mop[c][d]==1&&map[c][d]==1){l+=1;}
if(mop[c][d]==8&&map[c][d]==1){l+=2;}
if(mop[c][d]==8&&map[c][d]==8){l+=5;}
if(mop[c][d]==1&&map[c][d]==8){l+=7;}
mop[c][d]=map[c][d];
}
}
printf("%d\n",l);
}
   return 0;
}

頁: [1]