社区讨论

扯点闲话

灌水区参与者 4已保存回复 3

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
3 条
当前快照
1 份
快照标识符
@m1uf2khp
此快照首次捕获于
2024/10/04 15:41
去年
此快照最后确认于
2024/10/04 15:43
去年
查看原帖
CPP
#include<bits/stdc++.h>
using namespace std;
struct node{
	int tp, x, y;
}b[10];
string s[4] = {"Tang", "Kong", "Neng", "Jing"};
int get(string ss){
	for(int i = 0; i < 4; i++){
		if(ss == s[i]){
			return i;
		}
	}
}
int p, k, t, st, sum, num;
int c[10], vs[10], flg = 0;
void dfs(int dep, int pls){
	if(dep > t){
		int nsum = sum+pls*num, nst = st, nnum = num;
		for(int i = 1; i <= t; i++){
			int id = c[i];
			auto[tp, x, y] = b[id];
			if(tp == 0){
				nsum+=x;
			}else if(tp == 1){
				if(nsum >= x) nsum+=a[y]+pls, nst |= (1 << y), nnum++;
			}else{
				if((nst & x) == x) flg = 1;
			}
			if(nnum == 4) flg = 1;
		}
		return ;
	}
	for(int i = 1; i <= k; i++){
		if(!vs[i]){
			c[dep] = i, vs[i] = 1;
			dfs(dep+1, pls);
			vs[i] = 0;
		}
	}
}
bool check(int mid){
	flg = 0, dfs(1, mid);
	return flg;
}
int main(){
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	int n, m, tot = 0;
	cin >> n >> m;
	vector<int> w(n+1, 100);
	for(int i = 0; i < 4; i++){
		cin >> a[i];
		tot += a[i];
	}
	for(int o = 1; o <= n; o++){
		num = 4, st = (1 << 4)-1, sum = tot;
		cin >> p >> k >> t;
		for(int i = 1; i <= p; i++){
			string ss;
			cin >> ss;
			int id = get(ss);
			num--, st ^= (1 << id), sum -= a[id];
		}
		for(int i = 1, x; i <= k; i++){
			string ss;
			cin >> ss;
			if(ss == "G"){
				cin >> x;
				b[i] = {0, x, 0};
			}else if(ss == 'S'){
				cin >> ss >> x;
				int id = get(ss);
				b[i] = {1, x, id};
			}else{
				cin >> x;
				int nw = 0;
				for(int j = 1; j <= x; j++){
					cin >> ss;
					int id = get(ss);
					nw |= (a << id);
				}
				b[i] = {2, nw, 0};
			}
		}
		int l = 0, r = 100;
		while(l<=r){
			int mid = (l+r)>>1;
			if(check(mid)){
				w[o] = mid, r = mid-1;
			}else{
				l = mid+1;
			}
		}
	}
	vector<int> ans(m), mk(n+1);
	for(int o = 0; o < m; o++){
		int pd = 0;
		for(int i = 1; i <= n; i++){
			if(!mk[i] && w[i] <= o){
				pd = 1;
				ans[o] = i, mk[i] = 1;
				break;
			}
		}
		if(!pd){
			cout << "-1\n";
			return 0;
		}
	}
	for(int x : ans) cout << x << " ";
	cout << "\n";
	return 0;
}

回复

3 条回复,欢迎继续交流。

正在加载回复...