Tinkoff Challenge - Final Round (ABC)
A题:从两个保安中间那钞票
1 #include <bits/stdc++.h> 2 3 using namespace std; 4 5 int main() 6 { 7 int a,b,c; 8 scanf("%d%d%d",&a,&b,&c); 9 int n; 10 scanf("%d",&n); 11 int pos; 12 int ans = 0; 13 for(int i=0;i<n;i++) { 14 scanf("%d",&pos); 15 if(pos>b&&pos<c) 16 ans++; 17 } 18 printf("%d\n",ans); 19 return 0; 20 }
B题:切胡萝卜,每个面积相等;公式化简到最简试,否则精度会损失
1 #include <bits/stdc++.h> 2 3 using namespace std; 4 5 int main() 6 { 7 int n; 8 double h; 9 scanf("%d%lf",&n,&h); 10 /* 11 double s = h/n; 12 double S = h; 13 for(int i=0;i<n-1;i++) { 14 printf("%.12lf ",h*sqrt(s/S)); 15 s +=s; 16 } 17 */ 18 19 20 for(int i=1;i<n;i++) { 21 printf("%.12lf ",sqrt(i*1.0/n)*h); 22 } 23 24 return 0; 25 }
C题:两个绝顶聪明的人,第一个人要字典序最小,第二个人字典序最大;
贪心:
第一个人从小到大排,第二个人从大到小排,
当第一个人的最小的都大于第二个人的,那么他只能放到字符后面(否则第二个人就得逞了,他把他的放到后面),但是这样还不够,因为他反正还要继续放,那么他后面的操作将大于这次的,为何不交换一下呢? 这时,他应该从他的最大的那一个放到后面;
1 #include <iostream> 2 3 #include <cstdio> 4 5 #include <cstring> 6 7 #include <algorithm> 8 9 using namespace std; 10 11 const int maxn=300000+10; 12 13 char A[maxn],B[maxn],ans[maxn]; 14 15 bool cmp(char a,char b) { 16 return a>b; 17 } 18 19 int main() { 20 21 scanf("%s%s",A,B); 22 int len=strlen(A); 23 int l1=0,l2=0; 24 int r1,r2; 25 int L=0,R=len-1; 26 r1=(len+1)/2-1; 27 r2=len/2-1; 28 sort(A,A+len); 29 sort(B,B+len,cmp); 30 for(int i=0; i<len; i++) { 31 if(i%2==0) { 32 if(A[l1]<B[l2]) 33 ans[L++]=A[l1++]; 34 else ans[R--]=A[r1--]; 35 } else { 36 if(A[l1]<B[l2]) 37 ans[L++]=B[l2++]; 38 else ans[R--]=B[r2--]; 39 } 40 } 41 42 printf("%s\n",ans); 43 44 return 0; 45 46 }