小红拿到了许多糖果,她希望吃掉一些糖果,但每种糖果至少需要留下一个作为收藏,即每种糖果都不能吃光。小红想知道,自己最多可以吃多少糖果。 输入描述:第一行输入一个正整数n,代表糖果的数量;第二行输入n个正整数ai,代表糖果的种类。1<=n,ai<=100。 麻烦使用c++解决该问题
时间: 2024-03-23 09:39:49 浏览: 16
好的,这道题目可以使用贪心算法来解决。具体思路是:先对所有糖果种类进行去重,然后将去重后的糖果种类按照数量从小到大排序。接着,从数量最小的糖果种类开始,每次取走一个糖果,直到不能再取为止。最后,统计剩下的糖果总数即可。
下面是C++代码实现:
```
#include <iostream>
#include <algorithm>
#include <set>
using namespace std;
int main() {
int n;
cin >> n;
set<int> kinds;
for (int i = 0; i < n; i++) {
int a;
cin >> a;
kinds.insert(a);
}
int cnt = 0;
for (auto it = kinds.begin(); it != kinds.end(); it++) {
int num = count_if(kinds.begin(), kinds.end(), [&](int x){ return x == *it; });
cnt += num - 1;
}
cout << n - cnt << endl;
return 0;
}
```
输入示例:
```
7
1 2 2 3 3 3 4
```
输出示例:
```
4
```
希望能对你有所帮助!
相关问题
小红拿到了许多糖果,她希望吃掉一些糖果,但每种糖果至少需要留下一个作为收藏,即每种糖果都不能吃光。小红想知道,自己最多可以吃多少糖果。 输入描述:第一行输入一个正整数n,代表糖果的数量;第二行输入n个正整数so,代表糖果的种类。1<=n,ai<=100。 麻烦使用c++解决该问题
好的,这是一道典型的贪心算法题目。我们可以先将糖果种类按数量从小到大排序,然后从最小的一种糖果开始,每次吃掉其中的一个,直到无法再吃为止。接着再继续吃次小的糖果,直到全部都不能再吃为止。最后统计吃掉的糖果总数即可。
以下是C++代码实现:
```c++
#include <iostream>
#include <algorithm>
using namespace std;
int main() {
int n;
cin >> n;
int a[n];
for (int i = 0; i < n; i++) {
cin >> a[i];
}
sort(a, a + n); // 按数量从小到大排序
int cnt = 0;
for (int i = 0; i < n - 1; i++) { // 从小到大依次吃掉每种糖果
cnt += a[i] - 1;
}
cnt += a[n - 1] - 1; // 最后一种糖果也要留一个
cout << cnt << endl;
return 0;
}
```
希望能解决你的问题!
小红拿到了一个只包含 'a' , 'b' , 'c' 三种字符的字符串。 小红想知道,这个字符
小红可以通过遍历字符串,统计字符出现的次数来判断字符串。首先,小红可以定义三个变量aCount、bCount和cCount,分别用来记录字符'a'、'b'和'c'出现的次数。然后,小红遍历字符串的每一个字符,遇到字符'a'时,aCount加1,遇到字符'b'时,bCount加1,遇到字符'c'时,cCount加1。遍历结束后,小红可以比较aCount、bCount和cCount的大小,来判断字符串的特点。
如果aCount、bCount和cCount都为0,那么字符串为空字符串。
如果aCount等于字符串的长度,且bCount和cCount都为0,那么字符串只包含字符'a'。
如果bCount等于字符串的长度,且aCount和cCount都为0,那么字符串只包含字符'b'。
如果cCount等于字符串的长度,且aCount和bCount都为0,那么字符串只包含字符'c'。
如果aCount、bCount和cCount都不为0,那么字符串包含了多种字符。
这样,小红就可以判断字符串的特点了。