你最愿意做的哪件事,才是你的天赋所在

0%

Educational Codeforces Round 70 (Rated for Div. 2) 题解报告

题目链接

Educational Codeforces Round 70 (Rated for Div. 2)

A

题解

找到第二个字符串的最后一个1,让他能够与第一个字符串1能够相加即可

代码实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include<bits/stdc++.h>
using namespace std;
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
string s,s1;
cin>>s>>s1;
if(s1[s1.size()-1]=='1'&&s[s.size()-1]=='1')
{
printf("0\n");
continue;
}
int pos1;
for(int i=0;i<s1.size();i++)
{
if(s1[i]=='1')pos1=s1.size()-i;
}
for(int i=s.size()-pos1;i>=0;i--)
{
if(s[i]=='1')
{
printf("%d\n",s.size()-pos1-i);
break;
}
}
}
}

B

思路

首先读懂题目的意思之后,对于每一种类的计算机,我们可以用floyd求出他的距离,也就是从i-j需要插入多少个数,然后再匹配字符串就好了

代码实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
#include<bits/stdc++.h>
using namespace std;
long long dp[11][11];
long long ans[11][11];
int n;
string s;
void floyd(int x,int y)
{
memset(dp,0x3f,sizeof(dp));
for(int i =0;i<10;i++)
{
dp[i][(i+x)%10]=1;
dp[i][(i+y)%10]=1;
}
for(int k=0;k<100;k++)
{
for(int i=0;i<10;i++)
{
for(int j=0;j<10;j++)
{
dp[i][(j+x)%10]=min(dp[i][j]+1,dp[i][(j+x)%10]);
dp[i][(j+y)%10]=min(dp[i][j]+1,dp[i][(j+y)%10]);
}
}
}
}
long long solve()
{
long long res = 0;
for(int i=0;i<n-1;i++)
{
if(dp[s[i]-'0'][s[i+1]-'0']-1>1e17)return -1;
res +=dp[s[i]-'0'][s[i+1]-'0']-1;
}
if(res>1e17)return -1;
return res;
}
int main()
{
cin>>s;
n=s.size();
for(int i=0;i<10;i++)
{
for(int j=0;j<=i;j++)
{
floyd(i,j);
ans[i][j]=solve();
ans[j][i]=ans[i][j];
}
}
for(int i=0;i<10;i++)
{
for(int j=0;j<10;j++)
{
printf("%d ",ans[i][j]);
}
printf("\n");
}
}

D

思路

首先两个3能够为我们提供一个组合数C_{n}^{2},然后我们可以找出至少几个3,然后缺的一部分我们可以在后面补上1即可.
总体的形式就是先构建1(3~)(1~)337这样的话n就被分成两部分,第一部分(3~)可以用C_{n}^{2}来表示,第二部分就是n-C_{n}^{2}.

代码实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include<bits/stdc++.h>
using namespace std;
#define ll long long
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
ll n,len3;
scanf("%I64d",&n);
for(len3=2;len3*(len3-1)/2<=n;)len3++;
len3--;
ll len1 = n-len3*(len3-1)/2;
printf("1");
for(ll i=1;i<=len3-2;i++)printf("3");
for(ll i=1;i<=len1;i++)printf("1");
printf("337\n");
}
}
-------------你最愿意做的哪件事才是你的天赋所在-------------