Codeforces Round #654 (Div. 2)

    技术2024-02-01  76

    添加链接描述# A. Magical Sticks

    题意:

    给定长为 1 1 1~ n n n的木棍,任意连接,求最多能做多少根等长的木棍。

    思路:

    n n n为奇数,令前 n n n- 1 1 1根棍首尾相加,如: 1 1 1+ n n n- 1 1 1, 2 2 2+ n n n- 2 2 2、、、其和均为 n n n,即最多( n n n/ 2 2 2)+ 1 1 1根等长木棍。 若 n n n为偶数,n根棍首位相加,共( n n n/ 2 2 2)根等长木棍。

    代码:

    #include<bits/stdc++.h> #define ll long long using namespace std; int main() { int t;cin>>t; while(t--) { int n;cin>>n; if(n%2) cout<<(n/2)+1<<endl; else cout<<n/2<<endl; } }

    B. Magical Calendar

    题意:

    给定 n n n天, r r r(表示每周可以有的最大天数)。自定义每周天数 k k k( 1 < = k < = r 1<=k<=r 1<=k<=r),制成方格表日历,需在方格表中连续涂满 n n n天,观察得到的不同图形个数并输出。

    思路:

    画图找规律可知: k < n k<n k<n时,对首行来说可以从第 1 1 1~ k k k格开始填涂,故对于每个 k k k,都有 k k k种可能; k > = n k>=n k>=n时, n n n格连续填在一行中,只有一种形状,即一种可能。 总数对 r r r种情况求和

    代码:

    #include<bits/stdc++.h> #define ll long long using namespace std; int main() { int t;cin>>t; while(t--) { ll n,r; cin>>n>>r; if(n>r) cout<<(1+r)*r/2<<endl; else cout<<(1+n-1)*(n-1)/2+1<<endl; } }

    C. A Cookie for You

    题意:

    两种曲奇,数量分别为a,b,有两类人数量分别为n(选择数目多的那种曲奇),m(选择一个数目少的那种曲奇),每人选择一种曲奇,问是否每个人都能够拿到满意的曲奇。

    思路:

    当(a+b)<(n+m)时一定不满足; 当(a+b)>=(n+m) 时,先考虑m类人能否都能选到满意的曲奇,如果a,b中的最小值大于等于m,则每个人都能选到。

    代码:

    #include<bits/stdc++.h> #define ll long long using namespace std; int main() { int t;cin>>t; while(t--) { ll a,b,n,m; cin>>a>>b>>n>>m; if((a+b)<(n+m)) cout<<"No"<<endl; else if(m>min(a,b)) cout<<"No"<<endl; else cout<<"Yes"<<endl; } }

    D. Grid-00100

    题意:

    给定n,k,构造n*n的01矩阵,其中需包含k个1,令f=(最大行和−最小行和)2+(最大列和−最小列和)2,寻找f的最小值。

    思路:

    当k能被n整除时,可以使得每一行每一列个数相同,f(min)=0; 若不能被整除,对于余数r,把余数均分到每行后面,使得满足最大行和与最小行和相差1,最大列和与最小列和相差1,即f=1+1=2。

    代码:

    #include<bits/stdc++.h> #define ll long long using namespace std; int a[305][305]; int main() { int t;cin>>t; while(t--) { memset(a,0,sizeof(a)); int n,k;cin>>n>>k; if (k%n) cout<<'2'<<endl; else cout<<'0'<<endl; int p=0; for(int i=1;i<=k/n;i++) { for(int j=0;j<n;j++) a[j][(j+p)%n]=1; p++; } if (k%n) for(int i=0;i<k%n;i++) a[i][(i+p)%n]=1; for(int i=0;i<n;++i) { for(int j=0;j<n;++j) cout<<a[i][j]; cout<<endl; } } }

    E1. Asterism (Easy Version)

    题意:

    有一个初始值x,一个含n个数的数组,x与ai从a1~an按顺序进行比较,若x>=ai,x++;数组中数可以任意排列,使比较过程中一直有x>=ai,令f(x)为满足条件的数组情况数,给定质数p,求满足 f(x)%p !=0的x

    思路:

    先对数组a排序,对x的情况进行讨论:

    若x+n-1<amax,f(x)=0,不满足;若x>=amax,f(x)=n!(p<n),即f(x)%p=0,不满足;对amax-n+1<=x<amax,枚举x,计算f(x): 贪心,从大到小选位置 ai<=x,位置任意,即自乘ans(当前剩余位置数)ai>x: x+ans(当前x可达到最大值)<=ai,无法构成有效数组否则,自乘ai可选择位置数(x+ans-ai)

    代码:

    #include<bits/stdc++.h> #define ll long long using namespace std; int n,p; int a[2005],b[2005]; bool fun(int x) { int res=1,ans=n; for(int i=n;i>=1;--i) { if(a[i]<=x) res=res*ans%p; else if(x+ans<=a[i]) return 0; else res=res*(x+ans-a[i])%p; ans--; } if(res==0) return 0; else return 1; } int main() { cin>>n>>p; for(int i=1;i<=n;++i) cin>>a[i]; sort(a+1,a+n+1); for(int i=max(1,a[n]-n+1);i<a[n];++i) { if(fun(i)) { b[0]++;b[b[0]]=i; } } cout<<b[0]<<endl; if(b[0]!=0) { for(int i=1;i<=b[0];++i) cout<<b[i]<<' '; } }
    Processed: 0.016, SQL: 9