Codeforces#303-D. Queue-水题

http://codeforces.com/contest/545/problem/D

题意:

n个人排队,a[i]是那个人需要服务的时间

第i个人排队的时间是前面所有人服务+等待的时间之和

如果排队时间超过个人需要服务的时间他就会不开心

求如何排列使得最少人不开心


思路:

直接sort,从最小开始判断,如果当前人 排队时间超过个人需要服务的时间 直接 把他丢到最后(如果强行让他开心,那么前面必然有k个人要变成不开心,k>=1,所以直接丢掉他就好了)


最后输入 开心的人数就好了。。。。


#include <cstdio>
#include <cmath>
#include <cstring>
#include <string>
#include <algorithm>
#include <iostream>
#include <queue>
#include <map>
#include <set>
#include <vector>
using namespace std; 
__int64 tm[100005];  
__int64 vis[100005];  
int main()
{   
	__int64 i,j,n;
	scanf("%I64d",&n);
	 
	for (i=1;i<=n;i++)
	{
	scanf("%I64d",&tm[i]);
	} 
	sort(tm+1,tm+1+n);
	__int64 sum=0;
	
	for (i=1;i<=n;i++)
	{
		if (sum>tm[i])
		{
		vis[i]=1;
		}
		else
			sum+=tm[i];
	}

	__int64 ans=0;
	for (i=1;i<=n;i++)
	{
		if (vis[i]==0)
			ans++;
	}
	printf("%I64d\n",ans);
	
	
	
	
	
	
	return 0;
	
}


你可能感兴趣的:(Codeforces#303-D. Queue-水题)