自己比赛的时候也想了sort一下, 然后二分,但是还是没有想到枚举进位。。
这个题考虑进位的位置即可, 首先枚举进位是因为达到了10, 100, 1000..., 1e9
我还在考虑如果只按照各位排序的话,能不能推广到按10位,,100位排序, 想写个这样的sort函数,,,但其实用%100,%1000,然后创一个新的数组就可以了。。。
自己还是这些地方不好。。。
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#include<string>
#include<cstring>
#include<iomanip>
#include<iostream>
#include<stack>
#include<cmath>
#include<map>
#include<vector>
#define ll long long
#define inf 0x3f3f3f3f
#define INF 1000000000
#define bug1 cout<<"bug1"<<endl;
#define bug2 cout<<"bug2"<<endl;
#define bug3 cout<<"bug3"<<endl;
using namespace std;
const int maxn=1e5+5;
int a[maxn],b[maxn];
int main(){
int n;
while(~scanf("%d",&n)){
for(int i=1;i<=n;++i)scanf("%d",&a[i]);
int k=1;
ll ans=0;
for(int i=1;i<=9;++i){
k*=10;
for(int i=1;i<=n;++i)b[i]=a[i]%k;
sort(b+1,b+1+n);
for(int j=1;j<=n;++j){
int l=j+1,r=n+1;//这个r要是n+1...,还不知道这是不是 左闭右开的意思。。
while(l<r){//要用自己写的二分,如果用lower——bound 的话会
int mid=(l+r)>>1;
if(b[mid]+b[j]>=k)
r=mid;
else l=mid+1;
}
//ans+=n-(lower_bound(b+1,b+1+n,k-b[j])-b);//这是用lower——bound的二分,会错。。可能是因为
ans+=n-l+1;
}
}
cout<<ans<<endl;
}
}
1115



被折叠的 条评论
为什么被折叠?



