zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    HDU 1124 Factorial
    hdu 1690 Bus System
    hdu 1113 Word Amalgamation
    POJ 2482 Stars in Your Window
    hdu 1385 ZOJ 1456 Minimum Transport Cost(经典floyd)
    hdu 1907 John
    VMware 虚拟机 安装 UBuntu 9.10 命令模式转换成窗口模试
    #pragma CODE_SEG __NEAR_SEG NON_BANKED详解
    Ubuntu 下Hadoop 伪分布式 hadoop0.20.2.tar.gz 的安装
    文件拷贝代码以及疑问
  • 原文地址:https://www.cnblogs.com/Elfish/p/7694886.html
Copyright © 2011-2022 走看看