[CF977X]Codeforces Round #479 (Div. 3)
Posted studyingfather
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[CF977X]Codeforces Round #479 (Div. 3)相关的知识,希望对你有一定的参考价值。
在某位dalao的建议下,第一轮Div.3比赛总算是顺利举行了(然而开始几分钟服务器却炸了)。
题目非常的水啊,1个小时就AC了4道题,又把我那rating拉了回来。
题目链接
http://codeforces.com/contest/977
A. Wrong Subtraction
大意
给一个数字n,可以进行以下两种操作:
1、若n末尾不为0(n%10!=0),则n--
2、若n末尾等于0(n%10==0),则n%=10
求进行k次操作后n的值。
题解
模拟就好。
1 #include <stdio.h> 2 int n,k; 3 int main() 4 { 5 scanf("%d%d",&n,&k); 6 for(int i=1;i<=k;i++) 7 { 8 if(n%10==0)n/=10; 9 else n--; 10 } 11 printf("%d",n); 12 return 0; 13 }
B. Two-gram
大意
给出一个字符串,求出出现次数最多的长度为2的子串。
题解
把字符串扫一遍,然后将子串出现次数记录下来。
1 #include <stdio.h> 2 int t[35][35]; 3 char s[100]; 4 int maxt,ansi,ansj; 5 int main() 6 { 7 int n; 8 scanf("%d",&n); 9 scanf("%s",s); 10 for(int i=1;i<n;i++) 11 t[s[i-1]-‘A‘][s[i]-‘A‘]++;//这里计算子串出现的次数 12 for(int i=0;i<26;i++) 13 for(int j=0;j<26;j++) 14 if(t[i][j]>maxt) 15 { 16 ansi=i; 17 ansj=j; 18 maxt=t[i][j]; 19 } 20 printf("%c%c",ansi+‘A‘,ansj+‘A‘); 21 return 0; 22 }
C. Less or Equal
大意
给出一个包含n个数字的序列a,求出一个数x∈[1,10^9],使恰好k个数小于或等于x,如果无解,输出-1。
题解
可以将数列进行排序,如果a[k]==a[k+1]就意味着不可能有x,使恰好k个数小于或等于x。
但注意以下几个特判:
1、若k==0,如果a[1]==1,输出-1(x不能小于1),否则输出a[1]-1。
2、若k==n,输出a[n](你也可以输出1000000000,这是x的最大值)。
1 #include <cstdio> 2 #include <algorithm> 3 using namespace std; 4 int a[200005]; 5 int main() 6 { 7 int n,k; 8 scanf("%d%d",&n,&k); 9 for(int i=1;i<=n;i++) 10 scanf("%d",&a[i]); 11 sort(a+1,a+n+1); 12 if(k==0) 13 { 14 if(a[1]!=1)printf("%d",a[1]-1); 15 else printf("-1"); 16 } 17 else if(k==n)printf("%d",a[n]); 18 else if(a[k]==a[k+1])printf("-1"); 19 else printf("%d",a[k]); 20 return 0; 21 }
D. Divide by three, multiply by two
大意
给出一个序列,要求将其重排,使得数列中每个数字的后一个数字,是前一个数字的三分之一,或者是前一个数字的两倍。
题解
标准的dfs啊,直接搜不就好了,真的没什么可以说的。
1 #include <iostream> 2 using namespace std; 3 int n,vis[105]; 4 long long a[105],ans[105]; 5 void dfs(int d) 6 { 7 if(d==n+1) 8 { 9 for(int i=1;i<=n;i++) 10 cout<<ans[i]<<‘ ‘; 11 return; 12 } 13 for(int i=1;i<=n;i++) 14 { 15 if(!vis[i]) 16 { 17 if(d==1) 18 { 19 vis[i]=1; 20 ans[d]=a[i]; 21 dfs(d+1); 22 vis[i]=0; 23 ans[d]=0; 24 } 25 else if(3*a[i]==ans[d-1]||a[i]==2*ans[d-1]) 26 { 27 vis[i]=1; 28 ans[d]=a[i]; 29 dfs(d+1); 30 vis[i]=0; 31 ans[d]=0; 32 } 33 } 34 } 35 } 36 int main() 37 { 38 cin>>n; 39 for(int i=1;i<=n;i++) 40 cin>>a[i]; 41 dfs(1); 42 return 0; 43 }
以上是关于[CF977X]Codeforces Round #479 (Div. 3)的主要内容,如果未能解决你的问题,请参考以下文章
cf 20190307 Codeforces Round #543 (Div. 2, based on Technocup 2019 Final Round)
Codeforces Round #618 (Div.1) (Div.2) (CF1299) (CF1300)
小蒟蒻初次CF滚粗+爆炸记 (Codeforces Round #466 Div.2)
codeforces比赛题解#915 Educational CF Round 36