大家看一下
洛谷 P1102 A-B 数对
这道题很显然用二分法来做比较快,但是作为手残党,我还是选择了暴力遍历
这是我的代码:
code
#include<iostream>
#include<fstream>
#include <vector>
#include <iomanip>
#include <bits/stdc++.h>
#include <math.h>
#include <algorithm>
#include <cstring>
#include<bits/stdc++.h>
using namespace std;
bool jntm(int a,int b){
return a>b;
}
int main(){
long n,c,Dev_C=0;//定义N,C,计数器;
cin>>n>>c;//输入N,C;
long long nlis[n];//定义数组,用于存储正整数数列;
for(int i=0;i<n;i++){//输入数列;
cin>>nlis[i];
}
sort(nlis,nlis+n,jntm);//从大到小排序
for(int i=0;i<n-1;i++){//遍历列表;
for(int ii=i+1;ii<n;ii++){//遍历所有比当前数字小的数;
if(nlis[i]-nlis[ii]==c){//做差,若满足条件,则计数;
Dev_C++;
}
}
}
cout<<Dev_C;//输出计数器;
return/*191981*/0;
}
大家可以看看用户notTrueLight的一篇《#2#3#4 TLE,蒟蒻求助!!!》
发表于 2024-05-04 11:15
------------
**然后我也用相同的方法写了一遍代码,基本相同,大家去上文帖子里看**
于是乎https://www.luogu.com.cn/record/157909699
76分3个TLE........
我不甘心的下载了#2的测试点数据
我看到一下这一坨玩意
我了个天哪,我连输入都输入不进去(不知道为什么,没办法粘贴完整)我真的会谢
测试点见上
我的电脑瞬间变得非常卡
最后还是要上一下满分代码
//AC代码
#include<iostream>
#include<fstream>
#include <vector>
#include <iomanip>
#include <bits/stdc++.h>
#include <math.h>
#include <algorithm>
#include <cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
long long a[200010],n,c,ans;//这里注意ans要存long long,其他的存不存无所谓。否则第三个点会错。
int main()
{
scanf("%d%d",&n,&c);
for(int i=1;i<=n;i++)scanf("%d",&a[i]); //读入
sort(a+1,a+1+n);//注意要对这个数组进行排序,因为我们不知道他是否有序
for(int i=1;i<=n;i++)
{
int k=a[i]-c; //像上面说的,找到数组中A-C的个数。
ans+=upper_bound(a+1,a+1+n,k)-lower_bound(a+1,a+1+n,k);//刚才提到的技巧
if(a[i]-c==a[i])k--;//这里注意是数对,如果c等于零的话,二分时就会把自己也算进去,但是实际上是不可以的,所以要减去1.
}
printf("%lld",ans);
return 0;
}