Codeforces Round #654 (Div. 2)

    技术2022-07-14  65

    Codeforces Round #654 Div. 2

    A. Magical Sticks(找规律)B. Magical Calendar(找规律)C. A Cookie for You(思维)D. Grid-00100(构造)E1E2F

    A. Magical Sticks(找规律)

    题意:给你1到n总共n个数,任意两个数都可以组合起来(相加成为一个新的数),问最多能组合多少相同的数。

    题记: 如果n是奇数,那么可以把所有数组成n,一共有(n+1)/2个。

    如果n是偶数,把n减1当成奇数处理即可。

    #include<bits/stdc++.h> using namespace std; int main(){ ios::sync_with_stdio(false); cin.tie(0);cout.tie(0); int T; cin>>T; while(T--){ int n; cin>>n; cout<<(n+1)/2<<endl; } return 0; }

    B. Magical Calendar(找规律)

    题意:有连续的n天,选择一个k,k满足1≤k≤r,将k设置为一周的天数。一周中最后一天的下一天是一周中的第一天,即日历中移到下一行的第一个。问能在日历中所有天数的格子相连且形状不同有多少种。

    题记: 当n大于k时,情况一共有k种。由于k在1到r之间取值,所以答案是1+2+3+4+…+r,即(1+r)*r/2。

    当n小于等于k时,所有的形状都是一条直线,所以只有一种。 1+2+3+4+…+r-1,即n*(n-1)/2+1;

    #include<bits/stdc++.h> using namespace std; typedef long long ll; int main(){ ios::sync_with_stdio(false); cin.tie(0);cout.tie(0); int T; cin>>T; while(T--){ ll n,r; cin>>n>>r; ll ans; if(n>r) ans=(1+r)*r/2; else ans=n*(n-1)/2+1; cout<<ans<<endl; } return 0; }

    C. A Cookie for You(思维)

    题意:有a个香草味曲奇和b个巧克力味曲奇,n个一类客人和m个二类客人。’ v:当前香草味曲奇数量 c:当前巧克力味曲奇数量

    一类客人: v>c 选 v v≤c 选 c

    二类客人: v>c 选 c v≤c 选 v 题记:

    由于一类客人总会选数量多的那种曲奇,所以只要曲奇的总数量足够就能满足一类客人。

    但是二类客人总会选数量少的那种曲奇,所以在min(a,b)不能比二类客人的数量少。

    所以只需要判断一下m是否大于min(a,b)和a+b是否小于n+m即可得出答案。

    #include<bits/stdc++.h> using namespace std; typedef long long ll; int main(){ ios::sync_with_stdio(false); cin.tie(0);cout.tie(0); int T; cin>>T; while(T--){ ll a,b,n,m; cin>>a>>b>>n>>m; if(a+b<n+m||m>min(a,b)) cout<<"No"<<endl; else cout<<"Yes"<<endl; } return 0; }

    D. Grid-00100(构造)

    题意:构造一个n*n的矩阵,矩阵中有k个1,要使题目要求的f(A)最小。

    题记:f(A)只有0和2两种情况。构造的时候先将f(A)=0构造出来,然后看一下k%n是否有余数,然后将剩余的1放到前k%n行中。

    #include<bits/stdc++.h> using namespace std; typedef long long ll; const int N=305; int a[N][N]; int main(){ ios::sync_with_stdio(false); cin.tie(0);cout.tie(0); int T; cin>>T; while(T--){ int n,k; cin>>n>>k; if(k%n==0) cout<<"0"<<endl; else cout<<"2"<<endl; int t=0; memset(a,0,sizeof(a)); for(int i=1;i<=k/n;i++){ for(int j=0;j<n;j++) a[j][(j+t)%n]=1; t++; } if(k%n) for(int i=0;i<k%n;i++) a[i][(i+t)%n]=1; for(int i=0;i<n;i++){ for(int j=0;j<n;j++) cout<<a[i][j]; cout<<endl; } } return 0; }

    E1

    E2

    F

    Processed: 0.016, SQL: 9