用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
时间: 2023-05-20 20:01:38 浏览: 177
这道题可以使用贪心算法来解决。对于每一种图案的袜子,我们都要尽可能地凑成一对配套的袜子,因此我们可以分别统计左脚、右脚和左右脚都能穿的袜子的数量,然后按照以下规则进行配对:
1. 对于左脚或右脚的袜子,如果数量为偶数,则可以全部配对;如果数量为奇数,则只能配对其中的偶数个,剩下的一只袜子必须单独取出来。
2. 对于左右脚都能穿的袜子,如果数量为偶数,则可以全部配对;如果数量为奇数,则可以先取出一只袜子单独配对,然后剩下的袜子可以全部配对。
最后,如果还有剩余的袜子无法配对,则说明无法凑成一对配套的袜子,输出-1;否则,输出取出袜子的总数。
下面是代码实现:
#include <iostream>
#include <map>
using namespace std;
int main()
{
int n;
cin >> n;
map<int, int> left, right, both;
int total = 0, left_cnt = 0, right_cnt = 0, both_cnt = 0;
for (int i = 0; i < n; i++) {
int p, m;
char q;
cin >> p >> q >> m;
if (q == 'L') {
left[p] += m;
left_cnt += m;
} else if (q == 'R') {
right[p] += m;
right_cnt += m;
} else {
both[p] += m;
both_cnt += m;
}
total += m;
}
int cnt = 0;
if (left_cnt % 2 == 1) {
cnt += 1;
left_cnt -= 1;
}
if (right_cnt % 2 == 1) {
cnt += 1;
right_cnt -= 1;
}
cnt += min(left_cnt, right_cnt);
if (cnt == total) {
cout << cnt << endl;
return 0;
}
if (both_cnt % 2 == 1) {
cnt += 1;
both_cnt -= 1;
}
cnt += both_cnt;
if (cnt == total) {
cout << cnt << endl;
return 0;
}
cout << -1 << endl;
return 0;
}
阅读全文