比赛 20241125 评测结果 WAWAATTTT
题目名称 夏娜的菠萝包 最终得分 33
用户昵称 黄天宇 运行时间 7.526 s
代码语言 C++ 内存使用 3.35 MiB
提交时间 2024-11-25 11:07:47
显示代码纯文本
#include<bits/stdc++.h>
using namespace std;
int T;
int n,m;
const int MAXN=105; 
struct edge{
	int v;
	int d;
	int tt;
}e[MAXN];
struct mat{
	int s;
	int de;
	int t;
}w[MAXN];
int E;
int k[MAXN];
int num[MAXN][MAXN];
bool bo1,bo2,flag[MAXN];
int maxx;
void dfs(int nowt,int now,int sum){
	bo2=0;
	bo1=0;
	for(int i=1;i<=n;i++){
		if(!flag[i]){
			bo2=1;
			break;
		}
	}
	maxx=max(maxx,sum);
	if(!bo2||now==m+1){
		return;
	}
	for(int i=1;i<=m;i++){
		if(w[i].t<=nowt) continue;
		for(int j=1;j<=k[i];j++){
			if(flag[num[i][j]]) bo1=1;
		}
		if(bo1){
			bo1=0;
			continue;
		}
		for(int j=1;j<=k[i];j++){
			flag[num[i][j]]=1;
		}
		dfs(nowt+1,now+1,sum+w[i].s-nowt*w[i].de);
		for(int j=1;j<=k[i];j++){
			flag[num[i][j]]=0;
		}
	}
}
int main(){
	freopen("shana.in","r",stdin);
	freopen("shana.out","w",stdout);
	while(cin>>n){
		if(n==0) break;
		memset(flag,0,sizeof(flag));
		memset(e,0,sizeof(e));
		memset(num,0,sizeof(num));
		memset(w,0,sizeof(w));
		for(int i=1;i<=n;i++){
			cin>>e[i].v>>e[i].d;
			if(e[i].v%e[i].d==0) e[i].tt=e[i].v/e[i].d;
			else e[i].tt=e[i].v/e[i].d+1;
		}
		cin>>m;
		for(int i=1;i<=m;i++){
			cin>>k[i]>>E;
			w[i].t=10000;
			for(int j=1;j<=k[i];j++){
				cin>>num[i][j];
				w[i].s+=e[num[i][j]].v;
				w[i].de+=e[num[i][j]].d;
				w[i].t=min(w[i].t,e[num[i][j]].tt);
			}
			w[i].s+=E;
		}
		maxx=0;
		dfs(0,1,0);
		cout<<maxx<<endl;
		maxx=0;
	}
	return 0;
}