Codeforces Round #352 (Div. 2)

A. Summer Camp

题意:一行由1,2,3,4,5.....组成的数字串,它的第n个字符是什么

分析:根据数字的位数来推断。

代码:

 1 /*A*/
 2 #include<cstdio>
 3 #include<cstring>
 4 
 5 using namespace std;
 6 
 7 int s[1000];
 8 void First()
 9 {
10     int d;
11     s[0]=0;
12     for(int i=1;;i++)
13     {
14         if(i>=1&&i<=9)
15             d=1;
16         else if(i>9&&i<100)
17             d=2;
18         else if(i>99&&i<1000)
19             d=3;
20         else if(i>999&&i<10000)
21             d=4;
22         s[i]=s[i-1]+d;
23         if(s[i]>1000)
24         {
25             //printf("%d
",i);
26             break;    
27         }
28     }
29 }
30 
31 int main()
32 {
33     First();
34     int n;
35     while(scanf("%d",&n)!=EOF)
36     {
37         int p,q;
38         for(int i=0;;i++)
39         {
40             if(s[i]==n)
41             {
42                 p=i;
43                 if(i<=9)
44                     q=1;
45                 else if(i<=99)
46                     q=2;
47                 else if(i<=999)
48                     q=3;
49                 else if(i<=9999)
50                     q=4;
51                 break;
52             }
53             else if(s[i]<n&&s[i+1]>n)
54             {
55                 p=i+1;
56                 q=n-s[i];
57                 break;
58             }
59         }
60         char a[10];
61         memset(a,0,sizeof(a));
62         int i=0;
63         //printf("%d %d
",p,q);/**/
64         while(p)
65         {
66             int temp=p%10;
67             a[i++]=temp+'0';
68             p/=10;
69         }
70         printf("%c
",a[i-q]);
71     }
72     return 0;
73 }
View Code

B. Different is Good

题意:给一个长度为n 的字符串,要使这个字符串里没有相同的字符,需要改多少个字符,如果不可能实现则输出-1。

分析:扫一遍,记录下哪些字母是有的,有几个,同时计算有多少个字符需要改。入过需要改的字符数量多于没有用过的字母数量那么是不可能实现的,如果不多于,那么输出需要改的字符数。

代码:

 1 /*B*/
 2 #include<cstdio>
 3 #include<cstring>
 4 using namespace std;
 5 
 6 const int maxn=100000;
 7 
 8 int main()
 9 {
10     int n;
11     while(scanf("%d",&n)!=EOF)
12     {
13         char s[maxn];
14         scanf("%s",s);
15         int a[26];
16         memset(a,0,sizeof(a));
17         for(int i=0;i<n;i++)
18         {
19             int k=s[i]-'a';
20             a[k]++;
21         }
22         int p=0,q=0;
23         for(int i=0;i<26;i++)
24         {
25             if(a[i]==0)
26                 p++;
27             else
28                q+=a[i]-1;
29         }
30         if(q<=p)
31             printf("%d
",q);
32         else 
33             printf("-1");
34     }
35     return 0;
36 }
View Code

 C. Recycling Bottles

题意:两个人把所以瓶子扔进垃圾桶最少走多少距离。

分析:对每个瓶子分析,拿个瓶子,就要走这个瓶子到垃圾桶的距离的两倍。不过,根据Adil和Bear的初始位置,第一个见捡起来的瓶子所走的距离可能会缩短。可以贪心来找。

注意可以只让一个人捡,也可以两个人去捡。

代码:

  1 /*C*/
  2 #include<cstdio>
  3 #include<cmath>
  4 #include<cstring>
  5 #include<algorithm>
  6 const int maxn=100000+10;
  7 
  8 struct data{
  9     double x,y;
 10     double da;
 11     double db;
 12     double dt;
 13 };
 14         struct data a[maxn];
 15 double Dis(double a,double b,double c,double d)
 16 {
 17     return sqrt((a-c)*(a-c)+(b-d)*(b-d));
 18 }
 19 double min(double a,double b)
 20 {
 21     if(a<b)
 22         return a;
 23     else
 24         return b;
 25 }
 26 int main()
 27 {
 28     double ax,ay;
 29     double bx,by;
 30     double tx,ty;
 31     while(scanf("%lf%lf%lf%lf%lf%lf",&ax,&ay,&bx,&by,&tx,&ty)!=EOF)
 32     {
 33         int n;
 34 
 35         scanf("%d",&n);
 36         for(int i=0;i<n;i++)
 37         {
 38             scanf("%lf%lf",&a[i].x,&a[i].y);
 39             a[i].da=Dis(a[i].x,a[i].y,ax,ay);
 40             a[i].db=Dis(a[i].x,a[i].y,bx,by);
 41             a[i].dt=Dis(a[i].x,a[i].y,tx,ty);
 42         }
 43         double ans=0;
 44         for(int i=0;i<n;i++)
 45             ans+=2*a[i].dt;
 46         double max1=-1e20;
 47         int p;
 48         for(int i=0;i<n;i++)
 49         {
 50             if((a[i].dt-a[i].da)>max1)
 51             {
 52                 max1=a[i].dt-a[i].da;
 53                 p=i;
 54             }
 55         }
 56         double ans1=ans-max1;
 57         int q;
 58         double max2=-1e20;
 59         for(int i=0;i<n;i++)
 60         {
 61             if((a[i].dt-a[i].db)>max2)
 62             {
 63                 //if(i==p)    continue;
 64                 max2=a[i].dt-a[i].db;
 65                 q=i;
 66             }
 67         }
 68         double ans2=ans-max2;
 69         if(p==q)
 70         {
 71             int k;
 72             double maxk=-1e20;
 73             double d=a[p].dt-a[p].db;
 74             for(int i=0;i<n;i++)
 75             {
 76                 
 77                 if((a[i].dt-a[i].da+d)>maxk)
 78                 {
 79                     if(i==p)   continue;
 80                     maxk=a[i].dt-a[i].da+d;
 81                     k=i;
 82                 }
 83             }
 84             
 85             double maxt=-1e20;
 86             int t;
 87             d=a[p].dt-a[p].da;
 88             for(int i=0;i<n;i++)
 89             {
 90                 if((a[i].dt-a[i].db+d)>maxt)
 91                 {
 92                     if(i==p)    continue;
 93                     maxt=a[i].dt-a[i].db+d;
 94                     t=i;
 95                 }
 96             }
 97             if(maxk>maxt)
 98                 p=k;
 99             else
100                 q=t;
101         }
102         //printf("p:%d
",p);/**/
103         //printf("q:%d
",q);/**/
104         ans-=a[p].dt;
105         ans+=a[p].da;
106         ans-=a[q].dt;
107         ans+=a[q].db;
108         double ans3=min(ans,ans1);
109         ans3=min(ans3,ans2);
110         printf("%.15lf
",ans3);
111     }
112     return 0;
113 }
View Code
原文地址:https://www.cnblogs.com/yepiaoling/p/5502913.html