Codeforces Round #376 (Div. 2) (A.B.C)

来源:互联网 发布:unity3d怎么导入fbx 编辑:程序博客网 时间:2024/06/05 09:21

总结:记错了时间…我9点半兴冲冲的打开cf发现已经打完了…只能今天补一下了。

A

题目地址:http://codeforces.com/contest/731/problem/A

思路:模拟操作一下就好了。

AC代码:

#include<bits/stdc++.h>using namespace std;int main(){    char a[105];    while(~scanf("%s",a))    {        char temp='a';        int len=strlen(a);        int ans=0;        for(int i=0;i<len;i++)        {            int l1,l2;            l1=(a[i]-temp+26)%26;            l2=(temp-a[i]+26)%26;            ans+=min(l1,l2);            temp=a[i];        }        printf("%d\n",ans);    }}


B

题目地址:http://codeforces.com/contest/731/problem/B

思路:有两种购买的方式,都是买两张,但是第一种是一张给今天,一张给明天,而第二种是两张都给今天。考虑,当今日所需的pizza数为奇数时,那么对于第二天,就肯定会至少提前买好1张饼,那我们就改变下一天的数量。当有某一天被修改为了一个负数,或是最后一天是一个奇数,那么就说明无法实现。

AC代码:

#include<bits/stdc++.h>using namespace std;const int maxn=200000+10;int a[maxn];int n;int main(){    while(~scanf("%d",&n))    {        for(int i=1;i<=n;i++)            scanf("%d",&a[i]);            int temp=1;        for(int i=1;i<n;i++)        {            if(a[i]<0)            {                temp=0;                break;            }            if(a[i]%2==1)                a[i+1]=a[i+1]-1;        }        if(a[n]%2==1 || a[n]<0)            temp=0;        if(temp)            printf("YES\n");        else            printf("NO\n");    }}

C

题目地址:http://codeforces.com/contest/731/problem/C

思路:不知道k有什么用的就我一个吗……我们将需要在同一天穿的袜子放在一个集合里,然后对于每个集合,找到出现次数最多的颜色,那么对于这个集合,最少的操作数显然就是是把其他颜色都改为出现次数最多的这个颜色。这题在枚举所有集合时需要注意不要采用类似POJ1417里的那种n*n的方法,显然在这个数据规模下会超时。
AC代码:

#include<bits/stdc++.h>using namespace std;const int maxn=2000000+10;int fa[maxn];int val[maxn];int n,m,k;int a[maxn];vector<int>b[maxn];int find(int p){    if(p==fa[p])        return p;    fa[p]=find(fa[p]);    return fa[p];}void merge(int p,int q){    p=find(p);    q=find(q);    if(p!=q)    fa[p]=q;}int main(){    while(~scanf("%d%d%d",&n,&m,&k))    {        for(int i=0;i<=n;i++)            fa[i]=i;        for(int i=1;i<=n;i++)            scanf("%d",&val[i]);        for(int i=0;i<m;i++)        {            int p,q;            scanf("%d%d",&p,&q);            merge(p,q);        }        for(int i=0;i<=n;i++)        {            a[i]=0;            b[i].clear();        }        int cnt=1;        for(int i=1;i<=n;i++)        if(find(i)==i)           a[i]=cnt++;        for(int i=1;i<=n;i++)        b[a[find(i)]].push_back(val[i]);        int ans=0;        for(int i=1;i<cnt;i++)        {            int maxx=0;            map<int,int>m;            for(int j=0;j<b[i].size();j++)            {                if(!m.count(b[i][j]))                    m[b[i][j]]=0;                m[b[i][j]]++;                if(m[b[i][j]]>maxx)                maxx=m[b[i][j]];            }            ans+=b[i].size()-maxx;        }        printf("%d\n",ans);    }}

D,E,F看了下过题数……以后慢慢补……

0 0
原创粉丝点击