题目
翻译
题目
试想一下你有一个孪生兄弟或姐妹。有一个跟你长得如此之像的人是多么不可思议。很难说存在另一个自己是好是坏。如果你有一个孪生兄弟,那么你肯定非常了解他是怎样的人。
现在让我试想在一个平凡早晨。你还没有起床,你的妈妈已经准备去工作了。她实在太忙了导致她几乎忘了给她两个亲爱的孩子留些钱在学校食堂吃午餐。她摸摸了钱包发现了一些硬币,更确切地说,是
n
n
n个价值
a
a
a1,
a
a
a2,…
a
a
an,的硬币。然而妈妈已经没有时间了,她没有将硬币分配好,所以她留了张字条让你平等的分配。
你醒了,发现了你妈妈留下的硬币和字条。你转念一想“为什么要平等的分配?”。毕竟,你兄弟还在睡懒觉,他啥也不知道。所以你决定这样做:拿走一些硬币,确保你所得到的硬币价值大于你兄弟的。但你同样也知道你兄弟不是傻子,拿太多的话他肯定会发现。所以,你决定采取以下策略避免其发现:你要拿走最少数量的硬币,并且总价值大于你兄弟将获得的硬币价值。以此为基础,确定你要拿走的最少数量的硬币。
输入
第一行为整数 n n n(1 ≤ n n n ≤ 100)一 硬币的数量,第二行为 n n n个整数的序列 a a a1, a a a2,… a a an(1 ≤ a a ai ≤ 100) 一 硬币的价值。所有数字以空格分隔。
输出
输出一个整数 一 你最少要拿走多少硬币。
分析
根据题意可知,每个硬币价值不同,而要拿最少数量,即从最大的开始拿,又由于硬币价值序列是乱序的,所以要先排序,然后开始从大的拿,直到累加和大于总价值减去累加和(兄弟会获得的硬币价值)时,输出硬币数。
代码
#include<iostream>
#include<set>
using namespace std;
int main()
{
int n,sum_1=0,sum_2=0,i,j;
int a[101];
cin >> n;
for (i = 0; i < n; i++)
{
cin >> a[i];
sum_2 += a[i];
}
for(i = 0;i<n-1;i++)
for (j = 0; j < n - 1 - i; j++)
if (a[j] < a[j + 1])
{
a[j] += a[j + 1];
a[j + 1] = a[j] - a[j + 1];
a[j] -= a[j + 1];
}
i = 0;
while (sum_1 <= sum_2)
{
sum_1 += a[i];
sum_2 -= a[i];
i++;
}
cout << i;
return 0;
}