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的倍数,则会出现等边三角形,需要去重。

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

H-Planet NineGym - 102443H  by myl

构造题,首先转换为a到0和0到b

具体操作,采用数位DP的思想,每一位依次处理

从大到小删位,从小到大加位

因为是9的倍数,可以在10^9以内找到对应合适的加数

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

I-Dates Gym - 102443I  by myl

签到题,纯模拟,按照要求读取文字,判断日期并输出

 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 }
View Code
posted @ 2020-05-09 09:23  Hzoi_joker  阅读(274)  评论(0编辑  收藏  举报