5-6ACM训练题解(2019 Russia Team Open Contest)
D-Guess the Path Gym - 102443D by myl
交互题,二分
一开始只有(1,1)和(m, n)可以确认
每一次对于相邻的两个块,选取“5”字型的路线,先下到中线,再向右,在向下,可以发现中线上必有符合要求的点
每一次询问,都至少会确认三个点,同时点与点之间的范围减少一半
F-Isosceles trianglesGym - 102443F by ltr
分类讨论,一般情况下的解是n*((n-1)/2),也就是枚举定点,对称选(n-1)/2对底边。但是如果n是3的倍数,则会出现等边三角形,需要去重。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include<iostream> 2 #include<cstdlib> 3 #include<cstdio> 4 #include<algorithm> 5 #include<cstring> 6 #include<cmath> 7 using namespace std; 8 long long n; 9 int main() 10 { 11 scanf("%lld",&n); 12 if(n%3) printf("%lld\n",n*((n-1)/2)); 13 else printf("%lld\n",n*((n-1)/2)-n/3*2); 14 return 0; 15 }
H-Planet NineGym - 102443H by myl
构造题,首先转换为a到0和0到b
具体操作,采用数位DP的思想,每一位依次处理
从大到小删位,从小到大加位
因为是9的倍数,可以在10^9以内找到对应合适的加数
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include<cstdio> 2 #include<cstring> 3 long long a,b,c,d,e,f,g,m,n; 4 long long za[2000]={0},zb[2000]={0}; 5 long long w[20]; 6 char x[20]; 7 8 9 int main() 10 { 11 long long i,j,k; 12 w[1]=1; 13 for(i=2;i<=12;i++) 14 { 15 w[i]=w[i-1]*10; 16 } 17 scanf("%s",x); 18 a=strlen(x); 19 d=0; 20 for(j=0;j<a;j++) 21 { 22 b=x[j]-'0'; 23 if(b==1) 24 { 25 d++; 26 za[d]=2; 27 zb[d]=1; 28 } 29 if(b>=2) 30 { 31 c=0; 32 for(k=1;k<=b;k++) 33 { 34 c=c*10+k; 35 } 36 d++; 37 za[d]=1; 38 zb[d]=w[a-j]*c; 39 d++; 40 za[d]=2; 41 zb[d]=b; 42 } 43 } 44 scanf("%s",x); 45 a=strlen(x); 46 for(j=a-1;j>=0;j--) 47 { 48 b=x[j]-'0'; 49 if(b==9) 50 { 51 d++; 52 za[d]=1; 53 zb[d]=w[a-j]; 54 } 55 if((1<=b)&&(b<9)) 56 { 57 c=0; 58 for(k=8;k>=b+1;k--) 59 { 60 c=c*10+9-k; 61 } 62 c=c*10+10-b; 63 d++; 64 za[d]=1; 65 zb[d]=w[a-j]*c; 66 d++; 67 za[d]=2; 68 zb[d]=9-b; 69 } 70 } 71 printf("Stable\n%lld\n",d); 72 for(j=1;j<=d;j++) 73 { 74 if(za[j]==1) printf("+ %lld\n",zb[j]); 75 else printf("- %lld\n",zb[j]); 76 } 77 }
I-Dates Gym - 102443I by myl
签到题,纯模拟,按照要求读取文字,判断日期并输出
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include<cstdio> 2 int a,b,c,d,e,f,g,m,n; 3 char x[20]; 4 5 int main() 6 { 7 int i,j,k; 8 scanf("%d",&n); 9 for(i=1;i<=n;i++) 10 { 11 scanf("%s",x); 12 b=0; 13 c=0; 14 d=0; 15 j=0; 16 do 17 { 18 b=b*10+x[j]-'0'; 19 j++; 20 } 21 while(('0'<=x[j])&&(x[j]<='9')); 22 if(x[j]=='.') e=1; 23 else e=2; 24 j++; 25 do 26 { 27 c=c*10+x[j]-'0'; 28 j++; 29 } 30 while(('0'<=x[j])&&(x[j]<='9')); 31 j++; 32 do 33 { 34 d=d*10+x[j]-'0'; 35 j++; 36 } 37 while(('0'<=x[j])&&(x[j]<='9')); 38 if(e==1) printf("%02d.%02d.%04d %02d/%02d/%04d\n",b,c,d,c,b,d); 39 else printf("%02d.%02d.%04d %02d/%02d/%04d\n",c,b,d,b,c,d); 40 } 41 }