站外题目求解
  • 板块学术版
  • 楼主20240220ZHM
  • 当前回复11
  • 已保存回复11
  • 发布时间2024/1/25 19:59
  • 上次更新2024/1/25 21:49:50
查看原帖
站外题目求解
1267566
20240220ZHM楼主2024/1/25 19:59
第1题 考试 
浪子决定,利用高超的COMPUTER技术得到了本次试卷的内容——不看还好,一看就不得了——也忒难了点吧…… 
不过浪子只会做里面的M道题目,只好向附近的T个朋友请教。谁知道他们竟然开高价格,不过幸运的是,他们会帮你解决掉Ki道题目。 

输入格式
第1行,三个数 N,M,T(1≤M≤N≤30,1≤T≤10)。 
接下来一行,M个数(1≤每个数≤N),表示浪子会做的题目的编号(可能有重复,未必按升序排列)。 
接下来T行,每行第1个数是Pi(0≤Pi≤1000),表示收的辛苦费的价格;第2个数是Ki(1≤Ki≤min(N,10));再是Ki个数(1≤每个数≤N),表示第i位朋友会帮浪子做的题目的题号(可能有重复,未必按升序排列)。 
注:输入数据不存在无解情况——就是无法把这N道题目做完的方案。 

输出格式
一个数,浪子最少要准备多少辛苦费。

输入/输出例子1
输入:

10 5 3
1 3 5 7 9
10 4 1 2 3 4
20 4 5 6 7 8
100 10 6 7 8 9 10 1 2 3 4 5


输出:

100


样例解释
【样例说明】
去把第3个人喊来帮你做,只要付100块,还帮你全做了……

附上我的四十分代码

#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll f[3000],a[3000],m,s[3000];
ll s1[3000],s2[35][1005],ans=1e18,n,t;
void work(ll k,ll x) {
	if(k>t) {
		ll s6=0;
		for(int i=1;i<=n;i++) if(f[i]==0)s6=1;
		if(x<ans&&s6==0)  
			ans=x;	
		return ;
	}
	for(int i=1;i<=s1[k];i++) f[s2[k][i]]=0;
	for(int i=1;i<=m;i++) f[a[i]]=1;
	work(k+1,x);
	for(int i=1;i<=s1[k];i++) f[s2[k][i]]=1;
	work(k+1,x+s[k]);
}
int main() {
	cin>>n>>m>>t;
	for(int i=1;i<=m;i++) 
		cin>>a[i],f[a[i]]=1;
	for(int i=1;i<=t;i++) {
		cin>>s[i]>>s1[i];
		for(int j=1;j<=s1[i];j++) 
			cin>>s2[i][j];
	}
	 work(1,0); 
	 cout<<ans;      
	return 0;
}

2024/1/25 19:59
加载中...