SCU4439 二分+枚举进制+思维

来源:互联网 发布:mac怎么安装word 编辑:程序博客网 时间:2024/05/29 10:26

 

自己比赛的时候也想了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;    }}


 

0 0