Codeforces Round #410 (Div. 2) 解题报告

A.

因为A的题意导致这次罚时比较多……注意change一定是必须得改成不一样的,如a改成a是不行的。

 1 #include <iostream>
 2 #include <string>
 3 #include <algorithm>
 4 #include <cstring>
 5 #include <cstdio>
 6 #include <cmath>
 7 #include <queue>
 8 #include <set>
 9 #include <map>
10 #include <list>
11 #include <stack>
12 #define mp make_pair
13 typedef long long ll;
14 typedef unsigned long long ull;
15 const int MAX=1e6+1000;
16 const int INF=1e9+5;
17 using namespace std;
18 typedef pair<int,int> pii;
19 string x;
20 string y;
21 int cnt=0,len;
22 int main()
23 {
24     cin>>x;
25     y=x;
26 //    cout<<y;
27     len=x.length();
28     reverse(x.begin(),x.end());
29 //    cout<<x<<endl;
30     for(int i=0;i<len/2;++i)
31     {
32         if(x[i]!=y[i])
33             ++cnt;
34     }
35 //    printf("%d\n",cnt);
36     if(cnt==1||(cnt==0&&(len%2==1)))
37         printf("YES\n");
38     else
39     printf("NO\n");
40 }

B.

将第一个作为KMP的匹配串,滚动若干次,求f(next)数组,之后将所有串复制一倍放在后面,对每个串KMP。成功的条件为全都匹配成功,不然就是NO。

 1 #include <iostream>
 2 #include <string>
 3 #include <algorithm>
 4 #include <cstring>
 5 #include <cstdio>
 6 #include <cmath>
 7 #include <queue>
 8 #include <set>
 9 #include <map>
10 #include <list>
11 #include <stack>
12 #define mp make_pair
13 typedef long long ll;
14 typedef unsigned long long ull;
15 const int MAX=1e6+1000;
16 const int INF=1e9+5;
17 using namespace std;
18 typedef pair<int,int> pii;
19 int f[MAX];
20 string x;
21 string a[100];
22 int ci[100];
23 int n;
24 int an,he;
25 void getf(string x,int m)//m????????
26 {
27     f[0]=f[1]=0;
28     for(int i=2,j=0;i<=m;i++)
29     {
30         while(j&&x[j+1]!=x[i])
31             j=f[j];
32         if(x[j+1]==x[i])
33             j++;
34         f[i]=j;
35     }
36 }
37 int kmp(string x,string y)//??y?????x
38 {
39     getf(x,x.size());
40     for(int i=1,j=0;i<=y.size();i++)
41     {
42         while(j&&x[j+1]!=y[i])
43             j=f[j];
44         if(x[j+1]==y[i])
45             j++;
46         if(j>=x.size()-1)
47             return i-j;
48     }
49     return -1;
50 }
51 int main()
52 {
53     scanf("%d",&n);
54     string tem;
55     int len;
56     for(int i=0;i<n;i++)
57     {
58         cin>>a[i];
59         a[i]=a[i]+a[i];
60     }
61     len=a[0].length()/2;
62 //    printf("%d\n",len);
63     an=INF;
64     for(int i=0;i<len;i++)
65     {
66 //        he=0;
67         tem=" "+a[0].substr(i,len);
68         getf(tem,tem.length());
69 //        cout<<tem<<endl;
70         he=i;
71         for(int j=1;j<n;j++)
72         {
73             int l;
74             l=kmp(tem," "+a[j]);
75             if(l==-1)
76             {
77                 printf("-1\n");
78                 return 0;
79             }
80             he+=l;
81         }
82         an=min(he,an);
83     }
84     printf("%d\n",an);
85
86 }

C.

容易发现对于两个数连续做2次之后就都是偶数。2个奇数操作一次就成为偶数。先对本身所有数求gcd,如果有公共因子则已经成立,不然就按照上述规则,将所有数变为偶数。

#include <iostream>
#include <string>
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <queue>
#include <set>
#include <map>
#include <list>
#include <stack>
#define mp make_pair
typedef long long ll;
typedef unsigned long long ull;
const int MAX=1e6+1000;
const int INF=1e9+5;
using namespace std;
typedef pair<int,int> pii;
int gcd(int x,int y)
{
    if(y==0)
        return x;
    return gcd(y,x%y);
}
int gccd;
int a[MAX];
int n;
int ci;
int cnt;
int main()
{
    scanf("%d",&n);
    int i;
    for(i=0;i<n;i++)
    {
        scanf("%d",&a[i]);
    }
    gccd=a[0];
    for(i=1;i<n;++i)
    {
        gccd=gcd(gccd,a[i]);
        if(gccd==1)
            break;
    }
    if(i==n)
    {
        printf("YES\n0\n");
        return 0;
    }
    else
    {
        ci=cnt=0;
        a[n]=0;
        for(i=0;i<=n;++i)
        {
            if(a[i]%2)
                ++cnt;
            else
            {
                ci+=cnt/2;
                cnt%=2;
                if(cnt)
                    ci+=2;
                cnt=0;
            }
        }
        printf("YES\n%d\n",ci);
    }
}

D.

实在是太套路的一个题目……只描述奇数的情况,偶数随便取一个数之后就变成了奇数的情况。按A排序,取第一个。之后下标2k,2k+1两个数取其中b大的。按这种构造方法得到的即为符合题意的解。

 1 #include <string>
 2 #include <algorithm>
 3 #include <cstring>
 4 #include <cstdio>
 5 #include <iostream>
 6 #include <cmath>
 7 #include <queue>
 8 #include <set>
 9 #include <map>
10 #include <list>
11 #include <stack>
12 #define mp make_pair
13 typedef long long ll;
14 typedef unsigned long long ull;
15 const int MAX=1e5+1000;
16 const int INF=1e9+5;
17 using namespace std;
18 typedef pair<int,int> pii;
19 int n;
20 struct node
21 {
22     int a,b,j;
23 }x[MAX];
24 bool cmp(node c,node d)
25 {
26     if(c.a!=d.a)
27         return c.a>d.a;
28     else
29         return c.b>d.b;
30 }
31 int main()
32 {
33     scanf("%d",&n);
34     for(int i=1;i<=n;++i)
35         {
36             scanf("%d",&x[i].a);
37             x[i].j=i;
38         }
39     for(int i=1;i<=n;++i)
40         scanf("%d",&x[i].b);
41     sort(x+1,x+1+n,cmp);
42     printf("%d\n",n/2+1);
43     printf("%d ",x[1].j);
44     for(int i=1;i<=(n-1)/2;++i)
45     {
46         if(x[2*i].b>x[2*i+1].b)
47             printf("%d ",x[2*i].j);
48         else
49             printf("%d ",x[2*i+1].j);
50     }
51     if(n%2==0)
52     {
53         printf("%d ",x[n].j);
54     }
55     printf("\n");
56 }

时间: 2024-07-29 06:25:28

Codeforces Round #410 (Div. 2) 解题报告的相关文章

Codeforces Round #259 (Div. 2) 解题报告

终于重上DIV1了.... A:在正方形中输出一个菱形 解题代码: 1 // File Name: a.cpp 2 // Author: darkdream 3 // Created Time: 2014年08月01日 星期五 23时27分55秒 4 5 #include<vector> 6 #include<set> 7 #include<deque> 8 #include<stack> 9 #include<bitset> 10 #inclu

Codeforces Round #262 (Div. 2)解题报告

详见:http://robotcator.logdown.com/posts/221514-codeforces-round-262-div-2 1:A. Vasya and Socks   http://codeforces.com/contest/460/problem/A 有n双袜子,每天穿一双然后扔掉,每隔m天买一双新袜子,问最多少天后没有袜子穿.. 简单思维题:以前不注重这方面的训练,结果做了比较久,这种题自己边模拟边想.不过要多考虑trick ```c++ int main(){ i

Codeforces Round #616 (Div. 2)解题报告

Codeforces Round #616 (Div. 2)解题报告 A. Even But Not Even 找两个奇数就行了. #include<bits/stdc++.h> using namespace std; void solve() { int n; string s; cin >> n >> s; string ans = ""; for(int i = 0; i < n; i++) { if(int(s[i] - '0')%2

Codeforces Round #479 (Div. 3)解题报告

题目链接: http://codeforces.com/contest/977 A. Wrong Subtraction 题意 给定一个数x,求n次操作输出.操作规则:10的倍数则除10,否则减1 直接写,手速题,没啥好说的 B. Two-gram 题意 求出现次数最多的连续两个字符 还是签到题,我居然很麻烦地用了map,= =算了,思路畅通都无所谓了 #include <iostream> #include<stdio.h> #include<algorithm> #

Codeforces Round #515 (Div. 3) 解题报告(A~E)

题目链接:http://codeforces.com/contest/1066 A题: 题意:Vova想坐火车从1点到L点,在路上v的整数倍的点上分布着灯笼,而在路上从l到r处停着别的火车,它挡着Vova的视线使他看不到灯笼.给定L,v,l,r求Vova能看到的灯笼数. 分析:从1到x上所有的灯笼数量为x/v个.则路上所有的灯笼数为L/v个,被挡住的则为 r/v - (l-1)/v 个,相减即为答案. #include<iostream> #include<cstdio> #inc

Codeforces Round #401 (Div. 2)解题报告

A - Shell Game 1 #include <iostream> 2 #include<bits/stdc++.h> 3 #include <stack> 4 #include <queue> 5 #include <map> 6 #include <set> 7 #include <cstdio> 8 #include <cstring> 9 #include <algorithm> 10

Codeforces Round #390 (Div. 2) 解题报告

时隔一个月重返coding…… 期末复习了一个月也不亏 倒是都过了…… 就是计组61有点亏 复变68也太低了 其他都还好…… 假期做的第一场cf 三道题 还可以…… 最后room第三 standing383简直人生巅峰…… 看楼上楼下都是两道题的 如果A题不错那么多估计能进前300了吧…… 这场倒是把之前两场的分加回来了 开头不错 这个假期争取紫名~ A.Lesha and array splitting 把给定的数组分割成几个区间 要求各个区间和不能为0 一开始没注意到分割之后的区间重新合成之

Codeforces Round #394 (Div. 2) 解题报告

开始补题,今天下午virtual参赛,过了ABC,D题因为一点小错误而没能在比赛时间中AC,时间到了之后几分钟就发现了问题所在,略有遗憾.之后一直冥思苦想E题,在提示下终于明白,真的是给这样组合题画风的题目跪了,只能说继续加油,扩展思路吧. A题 题目地址 只有奇偶数个数相差小于等于1时可以,需要特判不能使二者均为0的情况. 参考代码 1 #include<stdio.h> 2 #include<bits/stdc++.h> 3 #include <iostream>

Codeforces Round #279 (Div. 2) 解题报告

A - Team Olympiad 贪心水题..都从第一个开始取即可. 代码如下: #include <iostream> #include <cstdio> #include <string> #include <cstring> #include <stdlib.h> #include <math.h> #include <ctype.h> #include <queue> #include <map