codeforces-160A .Twins-题解
题目翻译:
假设你有一个双胞胎兄弟或姐妹。有另一个和你长得一模一样的人似乎很不寻常,很难说拥有另一个自我是好是坏。如果你有一个双胞胎,你就会很清楚那是什么感觉。现在让我们想象一个典型的早晨在你的家庭。你还没醒,妈妈已经去上班了。她太性急了,几乎忘了给两个可爱的孩子留点钱去学校食堂买午饭。她在钱包里摸了摸,发现了一些硬币,确切地说,是n个任意值的硬币。但是妈妈快没时间了,她没给你们俩分硬币。所以她潦草地写了一张纸条,要求你平分这笔钱。
当你醒来时,你发现了妈妈的硬币,并读了她的纸条。“可是为什么要平分这笔钱呢?”——你的想法。毕竟,你的双胞胎在睡觉,他什么都不知道。所以你决定这样做:为你自己选择一些硬币的子集这样你的硬币的值的和就严格大于你的双胞胎兄弟剩下的硬币的值的和。然而,你正确地认为,如果你拿了太多的硬币,双胞胎会怀疑欺骗。因此,为了避免怀疑,您决定坚持以下策略:取硬币的最小数量,其值的和严格大于其余硬币的值的和。在此基础上,确定您需要采取的最小硬币数,以分割他们在描述的方式。
输入
第一行包含整数n(1≤n≤100)-硬币的数量。第二行包含n个整数a1 a2…,一个ai(1≤≤100)——硬币的价值。所有的数字都用空格隔开。
输出
在单行中打印单个数字—所需硬币的最小数量。
例子
inputCopy
2
3 3
outputCopy
2
inputCopy
3.
2 1 2
outputCopy
2
请注意
在第一个样本中,你需要取2个硬币(你和你的双胞胎的和相应的等于6,0。如果你拿一枚硬币,你得到和。如果你有0个硬币,你得到和。这些变量不能满足你的要求,因为你的和应该比你双胞胎的和严格。
在第二个样本中,一枚硬币对我们来说也不够。你可以选择1 2 2的硬币。在任何情况下,硬币的最小数量等于2。
下面是我的code:
#include<cstdio>
#include<algorithm>
#include<iostream>
using namespace std;
int main()
{
int n,ans=0,m=0,sum=0;
cin>>n;
int a[105];
for(int i=0;i<n;i++){
cin>>a[i];
sum+=a[i];
}
sort(a,a+n);
for(int i=n-1;i>=0;i--){
ans=ans+a[i];
sum=sum-a[i];
m++;
if(ans>sum){
cout<<m<<endl;
return 0;
}
}
}
这是电脑上找的:
#include <iostream>
#include <cstdio>
using namespace std;
const int N = 110;
int a[N];
int cmp(const void *a, const void *b)
{
return *(int *)b - *(int *)a;
}
int main()
{
int n, i, sum, sum1, ans;
scanf("%d", &n);
sum = 0;
for (i = 0; i < n; ++i)
{
scanf("%d", &a[i]);
sum += a[i];//求出总和
}
qsort(a, n, sizeof(a[0]), cmp);
sum1 = 0;
for (i = 0; i < n; ++i)
{
sum1 += a[i];
if (sum1 > sum - sum1)//所得的大于剩余的
{
ans = i + 1;
break;
}
}
printf("%d\n", ans);
return 0;
}