Codeforces Round #603 (Div. 2)

A. Sweet Problem

简单题,排个序判断a+b与c的关系,<就是a+b>是(a+b+c)/2

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e5+5;
ll a[3];
int main()
{
    int t;
    scanf("%d",&t);
 
    for(int i=1;i<=t;++i)
    {
        scanf("%d%d%d",&a[0],&a[1],&a[2]);
        sort(a,a+3);
        ll ans=0;
        if(a[0]+a[1]<=a[2])ans=a[0]+a[1];
        else ans+=a[2]+(a[0]+a[1]-a[2])/2;
        printf("%lld
",ans);
    }
    return 0;
}
View Code

B. PIN Codes

简单题,将不超过10个相同的数改动最少位使之全部不同。显然即使10个相同最多也只用改变一位,用桶排序判断该数出现次数,改变数字随便遍历一位求解即可。

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e5+5;
int a[100];
int b[10000];
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        memset(b,0,sizeof(b));
        int n;
        scanf("%d",&n);
        for(int i=1;i<=n;++i)
        {
            scanf("%d",&a[i]);
            b[a[i]]++;
        }
        int ans=0;
        for(int i=0;i<10000;++i)
        {
            if(b[i]>1)ans+=b[i]-1;
        }
        printf("%d
",ans);
        for(int i=1;i<=n;++i)
        {
            if(b[a[i]]==1)printf("%04d
",a[i]);
            else
            {
                for(int j=1;j<=9;++j)
                {
                    if(a[i]%10+j>9)
                    {
                        if(b[a[i]+j-10]==0)
                        {
                            printf("%04d
",a[i]+j-10);
                            b[a[i]+j-10]=1;
                            break;
                        }
                    }
                    else
                    {
                        if(b[a[i]+j]==0)
                        {
                            printf("%04d
",a[i]+j);
                            b[a[i]+j]=1;
                            break;
                        }
                    }
                }
                b[a[i]]--;
            }
        }
    }
    return 0;
}
View Code

C. Everyone is a Winner!

题意是让你输出n除以n+1到1的数,输出不重复的数字。数据范围给到了1e9,写了一个直接模拟的做法,可以发现sqrt(n)之前的数一定不同。所以可以直接输出0-sqrt(n)的数,后面的在模拟即可。复杂度降到O(sqrt(n))。统计个数的时候最初用了sqrt(n)*2。发现会有一点误差。所以是模拟算了一遍在输出。

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e5+5;
int a[100];
int b[10000];
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        int n;
        scanf("%d",&n);
        int p=-1;
        int ans=sqrt(n)+1;
        for(int i=sqrt(n);i>=1;--i)
        {
            if(n/i==i)continue;
            ans++;
        }
        printf("%d
0",ans);
        for(int i=1;i<=sqrt(n);++i)printf(" %d",i);
        for(int i=sqrt(n);i>=1;--i)
        {
            if(n/i==i)continue;
            printf(" %d",(n/i));
        }
        printf("
");
    }
    return 0;
}
View Code

D. Secret Passwords

题意是给出若干组字符串,不同组字符串如果有相同元素,就可以合并起来,求合并后还剩几组。应该是并查集的题目。由题意可知最多也只有26组。对于每组数据都让他们向最小的字母合并,最后判断该字母有没有出现和并查集等于自身的个数即可

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e6+5;
char s[N];
int b[30];
int f[30];
int c[30];
int main()
{
    int n;
    scanf("%d",&n);
    for(int i=0;i<30;++i)f[i]=i;
    for(int i=1;i<=n;++i)
    {
        scanf("%s",s);
        int len=strlen(s);
        for(int i=0;i<26;++i)b[i]=0;
        for(int j=0;j<len;++j)
        {
            b[s[j]-'a']++;
            c[s[j]-'a']++;
        }
        int flag=0;
        int t=0;
        for(int i=0;i<26;++i)
        {
            if(b[i])
            {
                if(flag==0)
                {
                    flag=1;
                    t=i;
                }
                else
                {
                    f[i]=t;
                }
            }
        }
    }
    int ans=0;
    for(int i=0;i<26;++i)if(c[i])ans++;
    for(int i=0;i<26;++i)
    {
        if(c[i]&&f[i]!=i)ans--;
    }
    printf("%d
",ans);
    return 0;
}
View Code
原文地址:https://www.cnblogs.com/yoududezongzi/p/11962164.html