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 |
5000+ms过了,附代码,用上快排和线表保存得到结果就可以避免超时了#include<stdio.h> #include<stdlib.h> // //int用交换函数 // void SwapInt(int *pInt,int pos1,int pos2) { int temp=pInt[pos1]; pInt[pos1]=pInt[pos2]; pInt[pos2]=temp; } // //int用快速排序 // void QuickSortInt(int *pInt,int start,int stop) { char *cdt="L"; int left=start,right=stop-1; while(left!=right) { if(cdt=="L") { if(pInt[left]>pInt[right]) { SwapInt(pInt,left,right); left++; cdt="R"; } else { right--; } } else if(cdt=="R") { if(pInt[right]<pInt[left]) { SwapInt(pInt,left,right); right--; cdt="L"; } else { left++; } } } if(start<left) QuickSortInt(pInt,start,left); if(left+1<stop) QuickSortInt(pInt,left+1,stop); } // //定义x的数目,最大值,系数和指数,两边的所得值,值长度 // int n,m; int k[6],p[6]; int valueL[10000000],valueR[10000000]; int lengthL,lengthR; // //定义int用pow函数 // int powInt(int base,int time) { int sum=1; for(int i=0;i<time;i++) { sum*=base; } return sum; } // //递归函数 // int Rec(int start,int stop,int value,char *way) { //如果到达终点 if(start==stop) { if(way=="L") { valueL[lengthL++]=value; } else if(way=="R") { valueR[lengthR++]=(-1)*value; } } //如果还未到达终点 else { for(int i=1;i<=m;i++) { Rec(start+1,stop,value+k[start]*powInt(i,p[start]),way); } } return 0; } // //main函数 // int main() { //初始化长度 lengthL=lengthR=0; //读取内容 scanf("%d%d",&n,&m); for(int i=0;i<n;i++) { scanf("%d%d",k+i,p+i); } //调用递归函数 Rec(0,n/2,0,"L"); Rec(n/2,n,0,"R"); //快速排序 QuickSortInt(valueL,0,lengthL); QuickSortInt(valueR,0,lengthR); //获取valueL和valueR中相等的发生次数 int sum=0; int timeL=1,timeR=1,left=0,right=0; for(timeL=1;left+1<lengthL&&valueL[left]==valueL[left+1];timeL++,left++) ; for(timeR=1;right+1<lengthR&&valueR[right]==valueR[right+1];timeR++,right++) ; while(left<lengthL&&right<lengthR) { if(valueL[left]<valueR[right]) { left++; for(timeL=1;left+1<lengthL&&valueL[left]==valueL[left+1];timeL++,left++) ; } else if(valueL[left]>valueR[right]) { right++; for(timeR=1;right+1<lengthR&&valueR[right]==valueR[right+1];timeR++,right++) ; } else if(valueL[left]==valueR[right]) { sum+=timeL*timeR; left++,right++; for(timeL=1;left+1<lengthL&&valueL[left]==valueL[left+1];timeL++,left++) ; for(timeR=1;right+1<lengthR&&valueR[right]==valueR[right+1];timeR++,right++) ; } } //输出结果后结束 printf("%d\n",sum); system("pause"); return 0; } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator