3 条题解

  • 0
    @ 2024-6-1 14:29:16

    二进制枚举即可

    #include <bits/stdc++.h>
    using namespace std;
    int n, m;
    int mp[200005], st[200005];
    int minn = INT_MAX, maxn;
    int a[15], b[15], c[25], p[15], q[15];
    int main()
    {
    	cin >> n >> m;
    	for(register int i = 1; i <= n; i++){
    		int s, t;
    		cin >> s >> t >> c[i];
    		maxn = max(maxn, t);
    		for(register int j = s; j <= t; j++) mp[j] = st[j] = c[i];//标记 
    	} 
    	for(register int i = 1; i <= m; i++) cin >> a[i] >> b[i] >> p[i] >> q[i];
    	for(register int i = 0; i <= (1 << m); i++){
    		int cost = 0;
    		int j = i, t = 0;
    		while(j){//二进制枚举 
    			t++;
    			if(j & 1){//买了第t个火炮
    				cost += q[t]; 
    				for(register int l = a[t]; l <= b[t]; l++) mp[l] -= p[t];
    			}
    			j >>= 1;
    		}
    		bool flag = 1;
    		for(register int k = 1; k <= maxn; k++){
    			if(mp[k] > 0) flag = 0;
    		} 
    		if(flag) minn = min(minn, cost);
    		for(register int k = 1; k <= maxn; k++) mp[k] = st[k];
    	}
    	cout << minn;
    	return 0;
    }
    

    信息

    ID
    3147
    时间
    1000ms
    内存
    256MiB
    难度
    7
    标签
    递交数
    190
    已通过
    40
    上传者