我优化的想法:将已知的两个数组进行排序,前者从小到大排序,后者从大到小排序。然后遍历第一个数组,针对每一个数字,再在第二个数组中查找,和大了向后找,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); //descend
for(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