小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
时间: 2023-05-20 19:01:37 浏览: 136
解题思路:
对于每一种图案,我们需要找到左脚和右脚都适配的袜子数量,以及只适配左脚和只适配右脚的袜子数量。如果左右脚都适配的袜子数量大于等于1,那么这些袜子就可以凑成一对。如果左右脚都适配的袜子数量为0,那么我们需要找到一只只适配左脚的袜子和一只只适配右脚的袜子,凑成一对。如果这两种袜子都没有,那么就无法凑成一对,输出-1。
对于每一种图案,我们需要找到左右脚都适配的袜子数量,以及只适配左脚和只适配右脚的袜子数量。我们可以用一个哈希表来存储每一种图案的袜子数量,然后遍历哈希表,统计左右脚都适配的袜子数量和只适配左脚和只适配右脚的袜子数量。最后根据上述规则计算出最少需要取出的袜子数量即可。
代码实现:
相关问题
帮我用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的袜子。
这是一个经典的贪心问题,我们可以按照以下步骤解决:
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;
}
已知共有a、b、c三种不同的袜子,现想用m元钱买n双袜子。a袜子5元一双,b袜子4元一双,c袜子2双1元。请在子函数体内求解有多少种不同的买法并输出解,同时求得的解法数返回主函数输出。(假设用户的输入m和n能确保有解)。注意只编子函数即可。
好的,以下是子函数的代码:
int buySocks(int m, int n) {
int count = ; // 记录解法数
for (int i = ; i <= n; i++) { // a袜子的数量
for (int j = ; j <= n - i; j++) { // b袜子的数量
int k = n - i - j; // c袜子的数量
int cost = i * 5 + j * 4 + k / 2; // 总花费
if (cost == m && k % 2 == ) { // 如果总花费等于m且c袜子数量为偶数
count++;
}
}
}
cout << "共有" << count << "种不同的买法" << endl;
return count;
}
这个函数接受两个参数m和n,分别表示总共有多少钱和要买多少双袜子。函数内部使用两个循环来枚举a袜子和b袜子的数量,然后计算出c袜子的数量,再根据价格计算出总花费。如果总花费等于m且c袜子数量为偶数,就说明这是一种合法的买法,解法数加1。最后输出解法数并返回。
阅读全文