解题报告:Codeforces Round #352 (Div. 2)

来源:互联网 发布:皇马4:1尤文 知乎 编辑:程序博客网 时间:2024/06/01 14:21

A.Summer Camp

题意:123456789101112```数字的字符串,询问第n个字符是什么(0<n<=1000)

思路:文件输出字符串存进数组

#include<cstdio>#include<cstring>#include<algorithm>#include<map>#include<iostream>using namespace std;char str[10000]={"123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500"};int main(){    //freopen("test.out","w",stdout);    int n;    while(scanf("%d",&n)==1)        printf("%c\n",str[n-1]);}


B.Different is Good


题意:对于给定的小写字母字符串,问最少改变多少个字母使得字符串的所有字符都不同,如果无法做到,输出-1

思路:长度大于26时,输出-1,不然输出 长度-字符种类

#include<cstdio>#include<cstring>#include<algorithm>#include<vector>#include<map>#include<iostream>using namespace std;char str[100005];int A[30];int main(){    int n;    while(scanf("%d",&n)==1)    {        memset(A,0,sizeof(A));        scanf("%s",str);        int num=0;        if(n>26){            printf("-1\n");            continue;        }        for(int i=0;i<n;i++){            int x = str[i]-'a';            if(A[x]==0){                num++;            }A[x]++;        }        printf("%d\n",n-num);    }}


C.Recycling Bottles


题意:两个给定初始位置的人和一个垃圾站的坐标,现在要捡完所有垃圾,每次捡一个垃圾后必须送回垃圾站才能继续捡下一个垃圾,所有垃圾的坐标给出,询问两人最小的路径和。


思路:捡完第一个垃圾后的路径长度都是一样的,所以只要选择最小的开始的组合就是答案

#include<cstdio>#include<cstring>#include<algorithm>#include<vector>#include<map>#include<iostream>#include<cmath>const double EPS = 1e-9;using namespace std;double dis[100005];int X[100005];int Y[100005];struct node{    double x;    int id;};node d1[100005];node d2[100005];inline bool cmp(const node& a ,const node& b){    return a.x<b.x;}inline double DIS(int a,int b,int c,int d){    return sqrt(pow((double)a-c,2.0)+pow((double)b-d,2.0));}int main(){    int x0,y0,x1,y1,x2,y2;    while(scanf("%d%d%d%d%d%d",&x1,&y1,&x2,&y2,&x0,&y0)==6)    {        double sum = 0;        int n;scanf("%d",&n);        for(int i=0;i<n;i++)        {            scanf("%d%d",&X[i],&Y[i]);            dis[i]=DIS(X[i],Y[i],x0,y0);            sum+=dis[i]*2;            d1[i].x=DIS(X[i],Y[i],x1,y1)-dis[i];d1[i].id=i;            d2[i].x=DIS(X[i],Y[i],x2,y2)-dis[i];d2[i].id=i;        }        sort(d1,d1+n,cmp);        sort(d2,d2+n,cmp);        double mi = min(d1[0].x,d2[0].x);        for(int i=0;i<n;i++)if(d1[i].id!=d2[0].id)            mi = min(mi,d1[i].x+d2[0].x);        for(int i=0;i<n;i++)if(d2[i].id!=d1[0].id)            mi = min(mi,d2[i].x+d1[0].x);        printf("%.8f\n",sum+mi);    }}

D.Robin Hood


题意:给定n个人手上的金币数,询问k次操作后最大和最小的金币数的差值,每次操作把拥有最多的金币数的人续一个金币给最小的金币数的人

思路:分别二分最小金币数和最大金币数,特判无论怎么都不能平均分配的情况,特判小心溢出。。。

#include<cstdio>#include<cstring>#include<algorithm>#include<vector>#include<map>#include<iostream>using namespace std;int n,k;int A[500005];inline bool judge1(int x){    int y = k;    for(int i=0;i<n&&y>=0&&A[i]<x;i++)    {        y -= ( x-A[i] );    }return y>=0;}inline bool judge2(int x){    int y = k;    for(int i=n-1;i>=0&&y>=0&&A[i]>x;i--)    {        y -= ( A[i]-x );    }return y>=0;}int main(){    while(scanf("%d%d",&n,&k)==2)    {        long long sum = 0;        for(int i=0;i<n;i++){            scanf("%d",&A[i]);            sum+=A[i];        }int x = (sum+n-1)/n;        sort(A,A+n);        long long a = 0;        int mi=0 ,mx= (long long)x*n==sum?0:1;        for(int i=0;i<n&&A[i]<x;i++){            a+=(x-A[i]);        }        if(a<=(long long)k){            printf("%d\n",mx-mi);            continue;        }        int s = A[0] , e = x ;        while(s<e)        {            int m = (s+e)/2;            if(m==s)break;            if(judge1(m)){                s = m;            }else {                e = m-1;            }        }mi=s;        if(s!=e)mi+=judge1(e);        s = x ; e = A[n-1];        while(s<e)        {            int m = (s+e)/2;            if(m==s)break;            if(judge2(m)){                e = m;            }else{                s = m+1;            }        }mx=e;        if(s!=e)mx -=judge2(s);        printf("%d\n",mx-mi);    }}

E.Ultimate Weirdness of an Array

E不会做啊~~~~~

0 0
原创粉丝点击