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 }
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 }
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 }