C 题 分情况讨论 然后总结
#include <algorithm>
#include <cstring>
#include <iostream>
using namespace std;
int main() {
int t,n,m;
cin>>t;
while(t--){
cin>>n>>m;
int maxv=-1;
int sum=0;
int tmp;
for(int i=1;i<=n;i++) {
cin>>tmp;
maxv=max(maxv,tmp);
sum+=tmp;
}
cout<<max(maxv,sum%m? sum/m+1:sum/m)<<endl;
}
return 0;
}
B题 状态压缩
复杂度 (cas*2^12*12*50) 觉得会超时 没敢写
训练过后 编了一下 结果没有超时。。
#include <iostream> #include <cstring> #include <vector> #include <cstdio> using namespace std; int dp[1<<12][502]; int f[1<<12]; int fact[13]; int p[14][15]; vector <int> hashst[13]; int one(int state,int j){ return (state&(1<<j)); } int zero(int state,int j){ return !one(state,j); } void init(){ for(int i=0;i<(1<<12);i++){ int sum=0; for(int j=0;j<12;j++){ if(one(i,j)) sum++; } f[i]=sum; } fact[0]=1; for(int i=1;i<=12;i++) fact[i]=fact[i-1]*i; } int gcd(int a,int b){ if(b) return gcd(b,a%b); else return a; } int main() { int t,n,m; init(); cin>>t; while(t--){ scanf("%d%d",&n,&m); memset(dp,0,sizeof(dp)); for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++){ scanf("%d",&p[i][j]); } } dp[0][0]=1; for(int state=0;state<(1<<n);state++){ for(int val=0;val<m;val++){ for(int k=1;k<=n;k++){ if(zero(state,k-1)&&(val+p[f[state]+1][k])<m){ dp[state|(1<<(k-1) )][val+p[f[state]+1][k]]+=dp[state][val]; } } } } int sum=0; for(int i=0;i<m;i++){ sum+=dp[(1<<n)-1][i]; } int ansh=fact[n]; int ansl=fact[n]-sum; int gc=gcd(ansh,ansl); if(ansl) cout<<ansh/gc<<'/'<<ansl/gc<<endl; else puts("No solution"); } return 0; }