Description
今天是校赛的日子,为了庆祝这么喜庆的日子,TMK打算买些礼物给女票LSH庆祝一下。
TMK进入了雪梨超市,然后刚踏入的一瞬间,店主就对TMK说:“恭喜你成为了本店第2147483647位顾客,本店在搞一个活动,对本店第2147483647位顾客进行赠送活动。你先看看你有多少钱?”
TMK一摸口袋,发现只有n个硬币,每个硬币的价值为a[i]。
然后店主继续说:“现在你用你的钱凑一些数,如果你的钱能凑成[0,x]里面所有的数,那么你将会免费获得该店价值x元的代金券,假设你有四个硬币面值分别为1,2,4,100,你就可以凑成[0,7]里面所有的数,我们将会送你7元的代金券。现在就用你的硬币来试试吧。Enjoy yourself!”
在TMK努力凑钱的时候,店主想知道他要送多少代金券给TMK。
Input
第一行一个整数T,表示数据组数。
对于每组数据,首先读入一个整数n(n<=100000),然后接下来的一行有n个整数,表示a[i] (0
#include<cstdio>
#include<cstring>
#include<stdlib.h>
#include<ctype.h>
#include<math.h>
#include<stack>
#include<queue>
#include<map>
#include<set>
#include<vector>
#include<string>
#include<iostream>
#include<algorithm>
#include<utility>
#include<iomanip>
#include<time.h>
#include<iostream>
using namespace std;
typedef long long ll;
const double Pi = acos(-1.0);
const int N = 1e6+10, M = 1e3+20, mod = 1e9+7, inf = 2e9+10;
const double e=2.718281828459 ;
const double esp=1e-9;
ll n,a[N];
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
scanf("%lld",&n);
for(int i=0; i<n; i++) scanf("%lld",&a[i]);
sort(a,a+n);
ll sum=0;
ll s=1;
int fla;
int k=0;
for(int i=0; i<n; i++)
{
if(a[i]==s)
{
s++; sum=0; k++;
}
else
{
fla=0;
for(int j=0; j<i; j++)
{
sum+=a[j];
if(sum==s)
{
s++; sum=0; fla=1; break;
}
}
if(fla==0)
{
s--; k++;
}
if(a[i]==s)
{
s++; sum=0; k++;
}
}
}
ll sum1=0;
for(int i=0; i<k; i++)
sum1+=a[i];
printf("%lld\n",sum1);
}
}
看看别人的代码,我也是醉了
#include<stdio.h>
#include<iostream>
#include<algorithm>
using namespace std;
int a[10000003];
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int n;
scanf("%d",&n);
for(int i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
sort(a,a+n);
int ans=0;
for(int i=0;i<n;i++)
{
if(a[i]<=ans+1)
ans+=a[i];
else break;
}
cout<<ans<<endl;
}
}