Codeforces Round #441 Div2

来源:互联网 发布:淘宝定金规则 编辑:程序博客网 时间:2024/05/16 11:33

http://codeforces.com/contest/876
1 给定三个人屋子之间的距离,你要去m个人的屋子里蹭饭,因为开始默认再某一个家里,你只需要再去m-1个。规定,不能再一个家里连续吃两顿饭。问你为了这m个饭,走的最短的距离。
直接暴力暴利的模拟。。

#include <bits/stdc++.h>using namespace std;/* 三个人。*/int a[3];int m;int main(){   while(~scanf("%d",&m)){         scanf("%d%d%d",&a[0],&a[1],&a[2]);          if(m==1)            puts("0");          else{              int sum=0;              int loc=1;              for(int i=1;i<=m-1;i++){                  if(loc==1){                  if(a[0]>a[1]){                      sum+=a[1];                      loc=3;                   }                   else{                      sum+=a[0];                      loc=2;                   }                  }                  else if(loc==2){                  if(a[0]>a[2]){                      sum+=a[2];                      loc=3;                   }                   else{                      sum+=a[0];                      loc=1;                   }                  }                  else if(loc==3){                  if(a[2]>a[1]){                      sum+=a[1];                      loc=1;                   }                   else{                      sum+=a[2];                      loc=2;                   }                  }              }              printf("%d\n",sum);          }          }    return 0;}

B 。。没有注意数据范围包括0。。。。。
其实直接统计余数就好了,但是我还搞了一个优先队列。。和以前做的题的做法差不多。。开始都放入x, 然后看x+k的数量,加入。并且统计一下数量。
但是这样错了。。因为如果只有一种数呢。。
比方说数据4 就全是0.。。。。

#include <bits/stdc++.h>using namespace std;const int maxn=2e5;int n,m,k;int a[maxn];int vis[maxn];int main(){   while(~scanf("%d%d%d",&m,&n,&k)){         memset(vis,0,sizeof(vis));         for(int i=0;i<m;i++){             scanf("%d",&a[i]);             vis[a[i]%k]++;         }         bool flag=false;         for(int i=0;i<k;i++){             if(vis[i]>=n&&!flag){                flag=true;                int num=n;                puts("Yes");                for(int j=0;j<m&&num;j++){                     if(a[j]%k==i){                        printf("%d ",a[j]);                       num--;                     }                }                cout<<endl;             }         }         if(!flag)            puts("No");   }    return 0;}

C 统计1-n中有多少满足 i+(i的各位数字之和)=i。。
嗯。。想一下范围。。。

#include <bits/stdc++.h>using namespace std;multiset<int>q;const int maxn=1e9;int solve(int s){    int num=0;    while(s){         num+=s%10;         s/=10;    }    return num;}vector<int>v;int main(){   int m;    scanf("%d",&m);    int ans=0;    v.clear();    for(int i=max(m-81,0);i<=m;i++){        if(solve(i)+i==m){             ans++;             v.push_back(i);             }    }    printf("%d\n",ans);    for(int i=0;i<v.size();i++){         if(i==0)            printf("%d",v[i]);         else            printf(" %d",v[i]);    }    printf("\n");    return 0;}

D明天补。

原创粉丝点击