Codeforces Round #654 (Div. 2)题解
A. Magical Sticks
思路:
尽可能的凑成长度为$n$的木棍,答案为$(n+1)/2$
#include<iostream> #include<algorithm> using namespace std; int main() { int t; cin>>t; while(t--){ int n; cin>>n; cout<<(n+1)/2<<endl; } return 0; }
B. Magical Calendar
思路:
分成两种情况:
①$k≤r$,答案就为$(1+k-1)*(k-1)/2+1$
②$k>r$,答案就为$(1+r)*r/2$
#include<iostream> #include<algorithm> using namespace std; typedef long long ll; int main() { int t; cin>>t; while(t--){ ll k,r,ans; cin>>k>>r; if(k<=r){ ans=(1+k-1)*(k-1)/2+1; } else ans=(1+r)*r/2; cout<<ans<<endl; } return 0; }
C. A Cookie for You
思路:
可以发现,第一类客人有什么就吃什么,但是第二类客人只吃少的那部分
所以,我们就只需要判断第二类客人够不够吃,已经总量够不够吃就好了
#include<iostream> #include<algorithm> using namespace std; typedef long long ll; int main() { int t; cin>>t; while(t--){ ll a,b,n,m; cin>>a>>b>>n>>m; if(min(a,b)>=m&&a+b>=n+m) cout<<"Yes"<<endl; else cout<<"No"<<endl; } return 0; }
D. Grid-00100
思路:
可以发现,答案要么为$2$要么为$0$
通过贪心,我们知道要将$1$尽可能均匀的放置在每行每列
构造方法为,现在先将$1$放置在主对角线上,然后再放置在右上角的副对角线上,再放在主对角左下放的副对角线上,依次交替,直到$k$为$0$
最后,如果$k%n==0$,答案就为$0$,否则为$2$
#include<bits/stdc++.h> using namespace std; const int N= 1e3+3; int t,n,k; int a[N]; int mat[N][N]; int main(){ cin>>t; while(t--){ cin>>n>>k; for(int i=0;i<n;i++) a[i]=i; memset(mat,0,sizeof mat); int now=0; for(int i=1;i<=k;i++){ mat[a[now]][now]=1; a[now]=(a[now]+1)%n; now=(now+1)%n; } if(k%n==0) cout<<0; else cout<<2; cout<<endl; for(int i=0;i<n;i++){ for(int j=0;j<n;j++) cout<<mat[i][j]; cout<<endl; } } }