Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
求助!实在找不出WA的原因啊?难道理解错了,还请那位仁兄帮帮忙啊,给几个测试数据也行啊!求助!实在找不出WA的原因啊?难道理解错了,还请那位仁兄帮帮忙啊, 给几个测试数据也行啊! 下面是源程序(后面还有一个是它的原版,容易看出思路): #include<stdio.h> #include<stdlib.h> #include<string.h> #include<malloc.h> #include<math.h> #define N 5000 #define MAX 70000 int hadcount(short m,int *p,short *d,int k) { if(d[m]) { *p=d[m]; return 1; } d[m]=k; return 0; } int main() { short source[N+1]={0}; short smaller[N+1][1]={{0}};//// short hadcnt[MAX+1]={0},dif[MAX+1]={0},lcnt[MAX+1]={0}; int i=0,j=0,k=0,l=0,l0=0; int n=0; int p=0; __int64 sets_1=0,sets_2=0,sets_3=0,sets_4=0,subnum[N+1]={0}; scanf("%d",&n); for(i=1;i<=n;i++) { scanf("%hd",&(source[i])); } for(i=n;i>=1;i--) { if(!hadcount(source[i],&p,dif,i)) { sets_1++; }else { sets_3-=subnum[p]; for(l=p+1;l<=n;l++) { if(source[p]>source[l]) { if(hadcount(source[l],&l0,lcnt,l)) continue; sets_4-=subnum[l]; } } dif[source[i]]=i;// memset(lcnt,0,sizeof(lcnt)); } for(j=i+1,k=1;j<=n;j++) { if(source[i]>source[j]) { if(hadcount(source[j],&p,hadcnt,k))// { continue; } sets_3+=smaller[j][0];////// sets_4+=subnum[j];////// smaller[i][0]++; subnum[i]+=smaller[j][0]; } } memset(hadcnt,0,sizeof(hadcnt)); } memset(hadcnt,0,sizeof(hadcnt)); //printf("4 %d\n",sets_4);// //printf("3 %d\n",sets_3);// if(sets_4!=0) { printf("4 %d\n",sets_4); }else if(sets_3!=0) { printf("3 %d\n",sets_3); }else { for(i=1;i<=n;i++) { if(hadcount(source[i],&p,hadcnt,1)) { continue; } sets_2+=smaller[i][0]; } if(sets_2!=0) { printf("2 %d\n",sets_2); }else { printf("1 %d\n",sets_1); } } return 0; } 这个是由下面这个程序转化过来的,下面这个用了太多的内存存中间结果,但是容易看出思路: #include<stdio.h> #include<stdlib.h> #include<string.h> #include<malloc.h> #include<math.h> #define N 5000 #define MAX 70000 int hadcount(short m,int *p,short *d,int k) { if(d[m]) { *p=d[m]; return 1; } d[m]=k; return 0; } int main() { short source[N+1]={0}; short *smaller[N+1],subnum[N+1]={0}; short hadcnt[MAX+1]={0},dif[MAX+1]={0}; int i=0,j=0,k=0; int n=0; int p=0; int sets_1=0,sets_2=0,sets_3=0,sets_4=0; for(i=1;i<=N;i++) { smaller[i]=(short *)malloc(sizeof(short)*(N+1));// memset(smaller[i],0,sizeof(short)*(N+1));// }/**/ scanf("%d",&n); for(i=1;i<=n;i++) { scanf("%d",&(source[i])); } for(i=n;i>=1;i--) { if(!hadcount(source[i],&p,dif,i)) { sets_1++; } for(j=i+1,k=1;j<=n;j++) { if(source[i]>source[j]) { if(hadcount(source[j],&p,hadcnt,k))// { continue; } smaller[i][k++]=j;// smaller[i][0]++; subnum[i]+=smaller[j][0]; } } memset(hadcnt,0,sizeof(hadcnt)); } for(i=1;i<=n;i++) { if(hadcount(source[i],&p,hadcnt,1)) { continue; } for(j=1;j<=smaller[i][0];j++) { sets_3+=smaller[smaller[i][j]][0]; sets_4+=subnum[smaller[i][j]]; } } memset(hadcnt,0,sizeof(hadcnt)); if(sets_4!=0) { printf("4 %d\n",sets_4); }else if(sets_3!=0) { printf("3 %d\n",sets_3); }else { for(i=1;i<=n;i++) { if(hadcount(source[i],&p,hadcnt,1)) { continue; } sets_2+=smaller[i][0]; } if(sets_2!=0) { printf("2 %d\n",sets_2); }else { printf("1 %d\n",sets_1); } } return 0; } Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator