帮我用c语言实现 题目描述 小K同学有一箱袜子,这些袜子各自有着不同的图案,并且有的袜子只能左脚穿、有的袜子只能右脚穿、还有的袜子左右脚都能穿。每天早上他都必须从箱子里拿出1对配套的袜子穿着出门(配套的袜子必须是图案相同的,并且左脚和右脚各有1只可以穿得上的袜子)。现在告诉你箱子里本质不同(图案不同或者左右脚适配性不同)的袜子各有多少只,小K同学想知道,他最少要从箱子里取出多少只袜子,才可以保证凑齐至少1对配套的袜子? 输入描述: 第一行输入一个正整数N,表示有多少种本质不同的袜子; 接下来的N行,每行输入P,Q,M,其中P是一个非负整数,表示袜子的图案;Q是一个字符,当Q取值为'L'时,表示袜子只适配左脚,当Q取值为'R'时,表示袜子只适配右脚,当Q取值为'*'时,表示袜子同时适配左右脚;M是一个正整数,表示这种袜子共有多少只。 (1<=N<=10^5,0<=P<=10^9,Q ∈ { 'L' , 'R' ,'*'},1<=M<=10^5) 输出描述: 对于每组测试数据,输出1个答案,表示最少取出的袜子数。若无法配对成功,输出-1。 示例1 输入 3 0 L 7 0 R 3 1 * 10 输出 9 说明 取出7只图案为0的左脚袜子,取出1只图案为0的右脚袜子,再取出1只图案为1的袜子。
时间: 2023-05-19 07:02:54 浏览: 171
这是一个经典的贪心问题,我们可以按照以下步骤解决:
1. 统计左脚、右脚和双脚袜子的数量。
2. 对于每一种图案,分别计算左脚、右脚和双脚袜子的数量。
3. 对于每一种图案,取左脚和右脚袜子数量的较小值,加起来就是这种图案最少需要取出的袜子数量。
4. 对于所有图案,将它们最少需要取出的袜子数量相加,就是总共需要取出的袜子数量。
5. 如果总共需要取出的袜子数量大于箱子里所有袜子的数量之和,说明无法配对成功,输出-1,否则输出总共需要取出的袜子数量。
下面是C语言的实现代码:
#include <stdio.h>
#include <string.h>
#define MAXN 100000
struct Sock {
int pattern;
int left;
int right;
int both;
};
int main() {
int n, i, j;
struct Sock socks[MAXN];
int cnt_left = 0, cnt_right = 0, cnt_both = 0;
int cnt_pattern[MAXN] = {0};
int cnt_pattern_left[MAXN] = {0};
int cnt_pattern_right[MAXN] = {0};
int cnt_pattern_both[MAXN] = {0};
int ans = 0;
scanf("%d", &n);
for (i = 0; i < n; i++) {
int pattern, m;
char q;
scanf("%d %c %d", &pattern, &q, &m);
socks[i].pattern = pattern;
if (q == 'L') {
socks[i].left = m;
cnt_left += m;
cnt_pattern_left[pattern] += m;
} else if (q == 'R') {
socks[i].right = m;
cnt_right += m;
cnt_pattern_right[pattern] += m;
} else {
socks[i].both = m;
cnt_both += m;
cnt_pattern_both[pattern] += m;
}
cnt_pattern[pattern] += m;
}
for (i = 0; i < n; i++) {
int min_cnt = cnt_pattern_left[socks[i].pattern];
if (cnt_pattern_right[socks[i].pattern] < min_cnt) {
min_cnt = cnt_pattern_right[socks[i].pattern];
}
if (cnt_pattern_both[socks[i].pattern] < min_cnt) {
min_cnt = cnt_pattern_both[socks[i].pattern];
}
ans += min_cnt;
}
if (ans * 2 > cnt_left + cnt_right + cnt_both) {
printf("-1\n");
} else {
printf("%d\n", ans);
}
return 0;
}
阅读全文