2020 Multi-University Training Contest 2(补题)
Lead of Wisdom
思路:暴力搜索。
#include<iostream>
typedef long long ll;
const int maxn=60;
int n,m,i,j,x,cnt[maxn],z[maxn],e[maxn][maxn][4];//z用于存储cnt不等于0的部分,e用于存储a,b,c,d;
ll ans;
void dfs(int x,int a,int b,int c,int d){
if(x>m){//x>m,搜索分支结束
ll tmp=1LL*a*b*c*d;
if(tmp>ans)ans=tmp;
return;
}
int num=cnt[x];
if(!num){//当cnt等于0跳过
dfs(z[x],a,b,c,d);
return;
}
for(int i=1;i<=num;i++)dfs(x+1,a+e[x][i][0],b+e[x][i][1],c+e[x][i][2],d+e[x][i][3]);
}
int main(){
int t;
scanf("%d",&t);
while(t--){
scanf("%d%d",&n,&m);
for(i=1;i<=m;i++)cnt[i]=0;
for(int i=0;i<n;i++)
{
scanf("%d",&x);
cnt[x]++;
for(j=0;j<4;j++)scanf("%d",&e[x][cnt[x]][j]);
}
x=m+1;
for(i=m;i;i--){
z[i]=x;
if(cnt[i])x=i;//当cnt不为零,则后一位记录
}
ans=0;
dfs(1,100,100,100,100);
printf("%lld\n",ans);
}
}The Oculus
直接根据A*B与C的差找到斐波那契数列中缺少的那一个。A与B与C取unsigned long long。
#include<iostream>
typedef unsigned long long ull;
const int maxn=3000005;
int i;
ull A,B,C,f[maxn];
ull read(){
int n,i,x;
ull ans=0;
scanf("%d",&n);
for(i=1;i<=n;i++){
scanf("%d",&x);
if(x)ans+=f[i];
}
return ans;
}
int main(){
for(f[1]=1,f[2]=2,i=3;i<3e6+5;i++)f[i]=f[i-1]+f[i-2];
int t;
scanf("%d",&t);
while(t--){
A=read();
B=read();
C=read();
A*=B;
for(i=1;C+f[i]!=A;i++);
printf("%d\n",i);
}
}