Codeforces#441 Div.2 四*题

Codeforces#441 Div.2 四*题   

链接

A. Trip For Meal

****喜欢吃蜂蜜。他每天要在朋友家享用N次蜂蜜 , 朋友A到B家的距离是 a ,A到C家的距离是b ,B到C家的距离是c  (A- >Rabbit   B- >Owl    C ->Eeyore),他不能连续两顿饭都在同一位朋友家里蹭

他现在位于A的家里, 请问他一天最少要跑多少路。

当然是要找一条最短的路折返跑了啊,是不是很简单。

#include<bits/stdc++.h>
using namespace std;
int N,a,b,c;
int main()
{
    cin>>N>>a>>b>>c;
    if        (N==1)printf("0
");
    else if    (N==2)printf("%d
",min(a,b));
    else if (N>=3){
        int k=min(a,b);
        if(k<=c)
            printf("%d
",(N-1)*k);
        else     printf("%d
",k+(N-2)*c);
    }
    return 0;
}
A

B. Divisiblity of Differences

给你一个有N个元素的可重集合,你需要找出一个含k个元素的子集,使里面的数两两的差都能被m整除

差 + 整除 -> 同余 -> 子集中的数对m同余

每个数都mod m 然后枚举余数就好了。

#include<bits/stdc++.h>
using namespace std;
int N,M,K,a[100005],vis[100005],ans=-1;
int main()
{
    scanf("%d%d%d",&N,&K,&M);
    for(int i=1;i<=N;i++){
        scanf("%d",&a[i]);
        vis[a[i]%M]++;
    }
    for(int i=0;i<M;i++){
        if(vis[i]>=K){
            ans=i;
            break;
        }
    }
    if(ans!=-1){
        printf("Yes
"); 
        for(int i=1;i<=N&&K;i++)
            if(a[i]%M==ans)printf("%d ",a[i]),K--;
        printf("
");
    }
    else printf("No
");
} 
B

C. Classroom Watch

先定义一个f(x) , f(x)的值就是  x的每一位加在一起 在加上它本身  f(123)=1+2+3+123=129

给你一个int范围内的整数N,求满足f(x)=N 的x有多少  和这些x的值

最多就十位数 各数位的数加在一起也超不过100  于是就 枚举 N-100~N 的所有数

#include<bits/stdc++.h>
using namespace std;
int N,ans[128],cnt;
void judge(int x)
{
    int sum=x,i=x;
    while(i){
        sum+=i%10;
        i=i/10;
    }
    if(sum==N)ans[++cnt]=x;
}
int main()
{
    scanf("%d",&N);
    for(int i=N-100>=0?N-100:0;i<=N;i++){
        judge(i);
    }
    printf("%d
",cnt);
    for(int i=1;i<=cnt;i++)
        printf("%d
",ans[i]);
    return 0;
}
C

D. Sorting the Coins

每次就是寻找最后一个O前面有多少x  ,很容易 ,看到有人拿树状数组什么的其实没必要 ,这个尤其好*护,而且很水

#include<bits/stdc++.h>
using namespace std;
int N,a[300005],vis[300005],ans;
int main()
{    
    scanf("%d",&N);
    printf("1 ");
    int zer=N;
    for(int i=1;i<=N;i++){
        scanf("%d",&a[i]);
        vis[a[i]]=1;
        if(a[i]>zer){
            printf("%d ",ans+1);
        }
        else{
            ans++;
            while(vis[zer])ans--,zer--;
            printf("%d ",ans+1);
        }
    }
    return 0;
}
D
原文地址:https://www.cnblogs.com/Elfish/p/7694886.html