逆天 A-B 数对测试点!!!一个TLE是怎么炼成的(这个事故告诉我们,有事没事不要随便模拟,数据点可以吓死人)

大家看一下
洛谷 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;
}

总之模拟会死
就写到这吧,下次有机会再扯谈doge

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值