| ||||||||||
| 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 | |||||||||
Re:求助!实在找不出WA的原因啊?难道理解错了,还请那位仁兄帮帮忙啊,给几个测试数据也行啊!In Reply To:求助!实在找不出WA的原因啊?难道理解错了,还请那位仁兄帮帮忙啊,给几个测试数据也行啊! Posted by:linht at 2006-08-10 00:00:47 > 求助!实在找不出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