标签:img getch sed getchar 技术 class copy 输入格式 位置
出题是一件痛苦的事情!
题目看多了也有审美疲劳,于是我舍弃了大家所熟悉的A+B Problem,改用A-B了哈哈!
好吧,题目是这样的:给出一串数以及一个数字C,要求计算出所有A-B=C的数对的个数。(不同位置的数字一样的数对算不同的数对)
第一行包括2个非负整数N和C,中间用空格隔开。
第二行有N个整数,中间用空格隔开,作为要求处理的那串数。
输出一行,表示该串数中包含的所有满足A-B=C的数对的个数。
对于73%的数据,N <= 2000;
对于100%的数据,N <= 200000。
所有输入数据都在longint范围内。
2017/4/29新添数据两组
sort排序+模拟84分
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #define N 200100 #define ll long long using namespace std; ll n,c,b,ans,a[N]; ll read() { ll x=0,f=1; char ch=getchar(); while(ch<‘0‘||ch>‘9‘){if(ch==‘-‘)f=-1;ch=getchar();} while(ch>=‘0‘&&ch<=‘9‘) x=x*10+ch-‘0‘,ch=getchar(); return x*f; } int main() { n=read(),c=read(),b=1; for(int i=1;i<=n;i++) a[i]=read(); sort(a+1,a+1+n); for(int i=1;i<=n;i++) for(int j=b;j<i;j++) if(a[i]-a[j]<=c) if(a[i]-a[j]==c) ans++; else break; else b=j; printf("%lld",ans); return 0; }
map AC
#include<map> #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #define N 200100 #define ll long long using namespace std; map<int,int>m; ll n,c,ans,a[N],maxn; ll read() { ll x=0,f=1; char ch=getchar(); while(ch<‘0‘||ch>‘9‘){if(ch==‘-‘)f=-1;ch=getchar();} while(ch>=‘0‘&&ch<=‘9‘) x=x*10+ch-‘0‘,ch=getchar(); return x*f; } int main() { n=read(),c=read(); for(int i=1;i<=n;i++) { a[i]=read(); m[a[i]]++; maxn=max(maxn,a[i]); } sort(a+1,a+1+n); for(int i=1;i<=n;i++) if(a[i]+c>maxn) break; else ans+=m[a[i]+c]; printf("%lld",ans); return 0; }
标签:img getch sed getchar 技术 class copy 输入格式 位置
原文地址:http://www.cnblogs.com/z360/p/7875212.html