算法周周练16 ABC
A
我们可以知道期望为n/m; 然后最后一个红包为n/m+n%m(以为两个期望会超过2n/m而且小于2n/m就为剩余的全部)
#include <bits/stdc++.h> #define ll long long using namespace std; ll t,m,n,k,cnt,q; int main() { ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0); cin>>m>>n>>t; while(t--) { cnt=n/m+n%m; cin>>q; if(q==m) cout<<cnt<<endl; else if(q>m) cout<<0<<endl; else cout<<n/m<<endl; } return 0; }
B
按题意模拟就行了
#include <bits/stdc++.h> #define ll long long using namespace std; int a[11]; int main() { ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0); while(cin>>a[1]>>a[2]>>a[3]>>a[4]>>a[5]>>a[6]>>a[7]>>a[8]>>a[9]>>a[10]) { int k=3; for(int i=1;i<=10;++i) { if(k==1&&(a[i]==0||a[i]==7)) continue; if(k==7&&(a[i]==0||a[i]==1)) continue; if(a[i]==1) k++; else if(a[i]==7) k--; } if(k==7) cout<<"666"<<endl; else cout<<"777"<<endl; } return 0; }
C
每一层黑点的为奇偶两种 从底层开始如果黑点数为偶数的话先手变然后后手变会使上层的点的颜色没有变化 所以后手必胜要全部层都为偶数
#include<bits/stdc++.h> #define ll long long using namespace std; const int maxn = 1005;///点数最大值 int n,cnt;///n个点,m条边 int ans[maxn][2],a[maxn],t[maxn]; struct Edge { int to,next;///终点,边权,同起点的上一条边的编号 }edge[maxn<<1];///边集 int head[maxn];///head[i],表示以i为起点的第一条边在边集数组的位置(编号) void add_edge(int u, int v)///加边,u起点,v终点,w边权 { edge[++cnt].to=v; ///终点 edge[cnt].next=head[u];///以u为起点上一条边的编号,也就是与这个边起点相同的上一条边的编号 head[u]=cnt;///更新以u为起点上一条边的编号 } void dfs(int u,int fa) { t[u]=t[fa]+1; ans[t[u]][a[u]]++; for (int j=head[u];j!=0;j=edge[j].next)///遍历以u为起点的边 { int v=edge[j].to; if(v==fa) continue; dfs(v,u); } } int main() { ios::sync_with_stdio(false); cin>>n; for(int i=1;i<=n;++i) cin>>a[i]; int u,v; for (int i=1;i<n;++i)///输入m条边 { cin>>u>>v; add_edge(u,v); add_edge(v,u); } dfs(1,0); for(int i=1;i<=n;++i) { if(ans[i][1]&1) {cout<<"First"<<endl;return 0;} } cout<<"Second"<<endl; return 0; }
具体看代码理解