Codeforces Round #441 Div2

xiaoxiao2021-02-28  18

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&#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明天补。

转载请注明原文地址: https://www.6miu.com/read-1450336.html

最新回复(0)