打卡信奥刷题(3470)用C++实现信奥题 P10561 [ICPC 2024 Xi‘an I] Smart Quality Inspector

P10561 [ICPC 2024 Xi’an I] Smart Quality Inspector

题目描述

Ella 有一家工厂。一天,她的工厂面临产品质量检查。 她的工厂有 NNN 条生产线。在这 NNN 条生产线中,有 N−KN-KNK 条是合格的,另外 KKK 条是不合格的。第 iii 条(1≤i≤K1\leq i\leq K1iK)不合格生产线的罚款为 iii 元。 这里有 MMM 名质量检查员。对于第 jjj 名(1≤j≤M1\leq j\leq M1jM)质量检查员,他将检查从第 lil_ili 条到第 rir_iri 条的生产线,并在其中找到罚款最高的不合格生产线,然后将此罚款施加给 Ella。 Ella 不想收到太多罚款,所以她决定重新编号这 NNN 条生产线以使收到的罚款最少。请帮助她。 简单来说: 你有一个长度为 NNN 的序列 AAAA=[1,2,3,...,K,0,0,0,...,0]A=[1,2,3,...,K,0,0,0,...,0]A=[1,2,3,...,K,0,0,0,...,0]。这里 N,KN,KN,K 已知。 有 MMM 对整数,每对由两个数字 li,ril_i,r_ili,ri 组成。 你需要重新排列序列 AAA 以最小化以下值: ∑i=1Mmax⁡j=liri(Aj)\sum_{i=1}^M \max_{j=l_i}^{r_i} (A_{j})i=1Mj=limaxri(Aj)

输入格式

第一行包含三个整数 N,K,M(1≤K≤N≤20,1≤M≤105)N,K,M(1\leq K\leq N\leq 20,1\leq M\leq 10^5)N,K,M(1KN20,1M105),如题所述。 接下来 MMM 行,每行包含两个整数 li,ri(1≤li≤ri≤N)l_i,r_i(1\leq l_i\leq r_i\leq N)li,ri(1liriN)

输出格式

一个整数,表示答案。

输入输出样例 #1

输入 #1

4 4 3
1 2
3 4
1 4

输出 #1

10

说明/提示

(由 ChatGPT 4o 翻译)

C++实现

#include <bits/stdc++.h>
using namespace std;
int n, k, m, l, r, ans=1e9, pre[25][25], f[2000010], lst[25], nxt[25];
int main(){
	scanf ("%d%d%d", &n, &k, &m);
	for (int i=1; i<=m; i++){
		scanf ("%d%d", &l, &r);
		pre[l][r] ++;
	}
	for (int i=1; i<=n; i++){
		for (int j=1; j<=n; j++){
			pre[i][j] = pre[i][j] + pre[i][j-1] + pre[i-1][j] - pre[i-1][j-1];
		}
	}
	for (int S=1; S<(1<<n); S++){
		int tot = 0;
		for (int i=0; i<n; i++){
			if ((S >> i) & 1) tot ++;
		}
		if (tot > k) continue;
		f[S] = 1e9, lst[0] = 0, nxt[n+1] = n+1;
		for (int i=0; i<n; i++){
			if ((S >> i) & 1) lst[i+1] = i+1;
			else lst[i+1] = lst[i];
		}
		for (int i=n-1; i>=0; i--){
			if ((S >> i) & 1) nxt[i+1] = i+1;
			else nxt[i+1] = nxt[i+2];
		}
		for (int i=0; i<n; i++){
			if (!((S >> i) & 1)) continue;
			int T = S - (1 << i);
			int st = lst[i], ed = nxt[i+2] - 2;
			int ad = pre[i+1][ed+1] - pre[st][ed+1] - pre[i+1][i] + pre[st][i];
			f[S] = min(f[S], f[T] + ad * (k - tot + 1));
		}
		if (tot == k) ans = min(ans, f[S]);
	}
	printf ("%d\n", ans);
	return 0;
}

在这里插入图片描述

后续

接下来我会不断用C++来实现信奥比赛中的算法题、GESP考级编程题实现、白名单赛事考题实现,记录日常的编程生活、比赛心得,感兴趣的请关注,我后续将继续分享相关内容

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值