1. 程式人生 > 實用技巧 >2020牛客暑期多校訓練營(第六場)解題報告

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