2020牛客暑期多校训练营(第六场)解题报告

C

温暖的签到题。找到答案最大的一列即可,因为如果有多列的话,一定可以分为两个行数不变的矩阵,其中一个答案一定不会变坏。我一开始还以为是0/1分数规划

#include <bits/stdc++.h>

using namespace std;

#define ll long long
ll input(){
	ll x=0,f=0;char ch=getchar();
	while(ch<'0'||ch>'9') f|=ch=='-',ch=getchar();
	while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();
	return f? -x:x;
}

const int N=207;

double a[N][N];

int main(){
	int T=input();

	while(T--){
		int n=input(),m=input();

		for(int i=1;i<=n;i++)
			for(int j=1;j<=m;j++)
				a[i][j]=input();
		
		double Ans=0;

		for(int j=1;j<=m;j++){
			double tmp=0;
			for(int i=1;i<=n;i++){
				tmp+=a[i][j];
				Ans=max(Ans,tmp/a[i][j]);
			}
			
		}

		printf("%.8lf\n",Ans);
	}
}

B

看样例解释易猜答案满足:

\[f(n)=\frac{\prod_{i=1}^n(2^i-1)}{2^i} \]

#include <bits/stdc++.h>

using namespace std;

#define ll long long
ll input(){
	ll x=0,f=0;char ch=getchar();
	while(ch<'0'||ch>'9') f|=ch=='-',ch=getchar();
	while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();
	return f? -x:x;
}

const int mod=1e9+7;
const int N=2e7+10;

ll powmod(ll a,ll b){
	ll res=1;
	while(b){
		if(b&1) res=res*a%mod;
		a=a*a%mod;
		b>>=1;
	}
	return res;
}
 
ll fz[N],ans[N],fm[N];

void init(){
	fz[1]=2;
    fm[1]=powmod(2,mod-2);
 
    for(int i=2;i<N;++i){
        fz[i]=fz[i-1]*2%mod;
        fm[i]=fm[i-1]*fm[1]%mod;
    }
 
    ans[1]=fm[1];
    for(int i=2;i<N;++i){
        ll tmp=(fz[i]-1+mod)%mod*fm[i]%mod;
        ans[i]=ans[i-1]*(fz[i]-1)%mod*fm[i]%mod ;
    }

    for(int i=2;i<N;++i) ans[i]=ans[i-1]^ans[i];
}

int main(){
	init();
    int T=input();
	while(T--){
        int n=input();
        printf("%lld\n",ans[n]);
    }
}

G

血亏题(赛后三分AC)。随意构造,按顺序依次填k种颜色是ok的。例如有3种颜色,填色方案如图:

不过要注意特判,颜色的数量要是\(2*(n+1)*n\)的约数,并且\(k=1\)\(n=1\)时都没有答案。(我就是没判\(n==1\)疼失AC😭)

#include <bits/stdc++.h>
 
using namespace std;
 
#define ll long long
ll input(){
    ll x=0,f=0;char ch=getchar();
    while(ch<'0'||ch>'9') f|=ch=='-',ch=getchar();
    while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();
    return f? -x:x;
}
 
const int N=407;
 
int h[N][N],L[N][N];
 
int main(){
    int T=input();
    while(T--){
        int n=input(),k=input();
 	
 		if(n==1||k==1){printf("-1\n");continue;}
        if((2*(n+1)*n)%k) printf("-1\n");
        else{
            int now=0;
            for(int i=1;i<=(n+1);i++){
                for(int j=1;j<=(n+1);j++){
                    if(j==(n+1)) continue;
                    // cout<<"h:"<<i<<" "<<j<<endl;
                    h[i][j]=now+1;
                    now=(now+1)%k;
                }
 
                for(int j=(n+1);j>=1;j--){
                    if(i==(n+1)) continue;
                    L[j][i]=now+1;
                    now=(now+1)%k;
                }
            }
             
            for(int i=1;i<=(n+1);i++)
                for(int j=1;j<=n;j++){
                    printf("%d%c",h[i][j],j==n? '\n':' ');
                }
 
            for(int i=1;i<=(n+1);i++)
                for(int j=1;j<=n;j++){
                    printf("%d%c",L[i][j],j==n? '\n':' ');
                }
        }
    }
}
posted @ 2020-07-29 16:09  _aether  阅读(208)  评论(0编辑  收藏  举报