Codeforces 621

来源:互联网 发布:京都 知乎 编辑:程序博客网 时间:2024/05/16 07:12

传送门:
http://codeforces.com/problemset/problem/621/A
sb题

#include<bits/stdc++.h>using namespace std;#define ll long longconst int maxn=1e5+10;ll a[maxn];int n;int main(){    cin>>n;int sum=0;ll summ=0;ll minn=1e18;    for(int i=1;i<=n;i++){        scanf("%lld",&a[i]);        if(a[i]&1) {            minn=min(minn,a[i]);sum++;        }        summ+=a[i];    }    if(sum&1){        summ-=minn;    }    cout<<summ<<endl;}

B:http://codeforces.com/problemset/problem/621/B
我还是比较喜欢这个写法的,用两个map写,可以将不同的对角线编号左斜和右斜,一个x+y是定值,一个x-y是定值,比我分着4个for循环讨论要优美多了!
优美:

#include<bits/stdc++.h>using namespace std;typedef long long ll;ll n,ans=0;map<ll,ll>M1,M2;int main(){    cin>>n;    ll x,y;    for(int i=0;i<n;i++){        cin>>x>>y;        ans+=M1[x+y];        M1[x+y]++;        ans+=M2[x-y];        M2[x-y]++;    }    cout<<ans;    return 0;}

我的屌丝写法:

#include<bits/stdc++.h>using namespace std;#define ll long longconst int maxn=2e5+10;int a[1005][1005];int n,x,y;ll ans;int main(){    cin>>n;ans=0;    for(int i=1;i<=n;i++){        scanf("%d%d",&x,&y);a[x][y]=1;    }     x=1;y=1;int sum;    for(int i=1;i<=1000;i++){        x=1;y=i;sum=0;        while(x<=1000&&y<=1000){            if(a[x][y]) sum++;             x++;y++;        }        ans+=sum*(sum-1)/2;    }//  cout<<"ans="<<ans<<endl;    x=1;y=1;    for(int i=2;i<=1000;i++){        y=1;x=i;sum=0;        while(x<=1000&&y<=1000){            if(a[x][y]) sum++;             x++;y++;        }        ans+=sum*(sum-1)/2;    }//cout<<"ans="<<ans<<endl;    x=1;y=1;    for(int i=1000;i>=1;i--){        x=1;y=i;sum=0;        while(x<=1000&&y>=1){            if(a[x][y]) sum++;             x++;y--;        }        ans+=sum*(sum-1)/2;    }//cout<<"ans="<<ans<<endl;    for(int i=2;i<=1000;i++){        y=1000;x=i;sum=0;        while(x<=1000&&y>=1){            if(a[x][y]) sum++;             x++;y--;        }        ans+=sum*(sum-1)/2;    }//cout<<"ans="<<ans<<endl;    printf("%lld\n",ans);}

C:http://codeforces.com/problemset/problem/621/C
概率题,因为p是质数,所以相邻数中只要有一个能整除p就可以了,因此扫一遍就行了,按对算,1到n,可以把n赋给0,然后正好就是扫一个环了。

#include<bits/stdc++.h>using namespace std;#define ll long longconst int maxn=1e5+10;const double eps=1e-8;double a[maxn];double sum=0;int n,p,l,r;double cal(double l,double r){    return (double)(1-(1-l)*(1-r));}int main(){    cin>>n>>p;    for(int i=1;i<=n;i++){        scanf("%d%d",&l,&r);        int num=(r)/p-(l-1)/p;        a[i]=(double)num/(double)(r-l+1);    //  cout<<"a[i]="<<a[i]<<endl;    }    sum=2000.0*cal(a[1],a[n]);    for(int i=1;i<=n-1;i++){        sum+=2000.0*(cal(a[i],a[i+1]));    }    printf("%.6f\n",sum);}
1 0
原创粉丝点击