寻找固定的和(C百例)

来源:互联网 发布:知乎马前卒是谁 编辑:程序博客网 时间:2024/05/16 00:59


我优化的想法:将已知的两个数组进行排序,前者从小到大排序,后者从大到小排序。然后遍历第一个数组,针对每一个数字,再在第二个数组中查找,和大了向后找,dex++,找到了就count++且dex++,当a[i]+b[dex]<sum时跳出第二个循环遍历,但是dex不要变回1,继续第一个数组遍历,重复这个过程。
产生输入数据:

#include<cstdio>#include<cmath>#include<iostream>using namespace std;const int maxn=1e4;#define pi 3.1415926 int main(){freopen("cout.txt","w",stdout);cout<<maxn<<" "<<8010<<endl;    for(int i=1;i<=3000;i++)printf("%d ",i);    for(int i=6000;i<=maxn;i++)printf("%d ",i);    for(int i=3001;i<6000;i++)printf("%d ",i);    cout<<endl;    for(int i=1;i<5000;i++)printf("%d ",int(i*1.5));    for(int i=5000;i<=maxn;i++)printf("%d ",(int)(50*sin(pi/6*i))+i);return 0;}

暴力双循环:
#include <iostream>#include<cstdio> #include<time.h>using namespace std;const int maxn=1e4+5;int a[maxn],b[maxn];int main(int argc, char *argv[]) {freopen("cin.txt","r",stdin);freopen("cout.txt","w",stdout); int n,sum,count;while(cin>>n>>sum){count=0;clock_t start,finish;for(int i=1;i<=n;i++)scanf("%d",&a[i]);for(int i=1;i<=n;i++)scanf("%d",&b[i]);start=clock();for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){if(a[i]+b[j]==sum){//printf("%d+%d=%d ",a[i],b[j],sum);count++;}}}finish=clock();printf("找到%d个,",count);printf("时间:%.8lf\n",(double)(finish-start)/CLOCKS_PER_SEC);}return 0;}
结果:找到8008个,时间:0.61500000

优化:

#include <iostream>#include<cstdio> #include<time.h>#include<algorithm>using namespace std;const int maxn=1e4+5;int a[maxn],b[maxn];bool cmp(int q1,int q2){return q1>q2;}int main(int argc, char *argv[]) {freopen("cin.txt","r",stdin);freopen("cout.txt","w",stdout); int n,sum,count;while(cin>>n>>sum){count=0;clock_t start,finish;for(int i=1;i<=n;i++)scanf("%d",&a[i]);for(int i=1;i<=n;i++)scanf("%d",&b[i]);start=clock();int dex=1;sort(a+1,a+1+n); //rise sort(b+1,b+1+n,cmp);  //descendfor(int i=1;i<=n;i++){while(a[i]+b[dex]>=sum&&dex<=n){    if(a[i]+b[dex]==sum){    count++;    //printf("%d+%d=%d ",a[i],b[dex],sum);  输出也占了不少时间,让1.4s-->0.007     }dex++;}}finish=clock();printf("找到%d个,",count);printf("时间:%.8lf\n",(double)(finish-start)/CLOCKS_PER_SEC);}return 0;}
结果:找到8008个,时间:0.00700000

0 0
原创粉丝点击