标签:spl algo 答案 cout 小朋友 stream 数据 方案 ios
楠楠在网上刷题,感觉第一题:求两数的和(A+B Problem)太无聊了,于是增加了一题:A-B Problem,难倒了一群小朋友,哈哈。
题目是这样的:给出N个从小到大排好序的整数,一个差值C,要求在这N个整数中找两个数A和B,使得A-B=C,问这样的方案有多少种?
例如:N=5,C=2,5个整数是:2 2 4 8 10。答案是3。
具体方案:第3个数减第1个数;第3个数减第2个数;第5个数减第4个数。
第一行,两个正整数:N,C。
第二行,N个整数:已经有序。注意:可能有相同的。
一行,一个整数,表示该串数中包含的所有满足A-B=C的数对的方案数。
4 1
1 1 2 2
4
50%的数据:N的范围是[1...1000]。
100%的数据:N的范围是[1...100000]。
所有数据:C的范围是[1...1000000000],N个整数中每个数的范围是:[0...1000000000]。
当给定a时,满足a+b=c的b是唯一的,我们可以根据这个特性来用尺取法遍历这个区间,从而得出结果。
#include<iostream> #include<algorithm> using namespace std; int n,c,a[100005],b[100005],tn,num; int main() { cin>>n>>c; for(int i=1;i<=n;i++) { cin>>a[i]; if(a[i]==0) { if(tn==0) { tn++; } a[tn]=a[i]; } else if(a[i]>a[tn]) { tn++; a[tn]=a[i]; } b[tn]++; } for(int i=1;i<tn;i++) { for(int low=i+1,high=tn;;) { int mid=(low+high)/2; if(low>high) { break; } else if(a[mid]-a[i]==c) { num+=b[i]*b[mid]; break; } else if(a[mid]-a[i]<c) { low=mid+1; } else { high=mid-1; } } } cout<<num; return 0; }
标签:spl algo 答案 cout 小朋友 stream 数据 方案 ios
原文地址:https://www.cnblogs.com/kcn999/p/10352416.html