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

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

C. Less or Equal

大意

给出一个包含n个数字的序列a,求出一个数x∈[1,10^9],使恰好k个数小于或等于x,如果无解,输出-1。

扫描二维码关注公众号,回复: 479198 查看本文章

题解

可以将数列进行排序,如果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 }
View Code

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

猜你喜欢

转载自www.cnblogs.com/StudyingFather/p/9023545.html