Uva1614(Hell on the Markets)(贪心)

----------------------------------------------------------------------------------------------------------------------------------
题面不好发,这次就先不发了

思路:参考了博客 https://blog.csdn.net/outp0st/article/details/73499064的想法
比赛的时候死磕dp,最后没推出来,一直没往贪心上想,导致这道签到题没做出来。。。

其实就是先从大到小排序,一个一个加,如果比tot/2,就不加,比他小就加。等于的话就找到了。但这道题贪心的证法还是参考那个博客上的吧。(我太弱了,证不出来~)
上代码:
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
typedef struct 
{
	int num;
	int id;
	int sta;
} Node;
Node node[100010];
bool cmp(Node b,Node c)
{
	return b.num>c.num;
}
bool cmp2(Node b,Node c)
{
	return b.id<c.id;
}
int main()
{
    int n; 
	while(scanf("%d",&n)!=EOF)
    {
    	long long int tot=0;
    	for(int i=0;i<n;i++)
    		{
    		   scanf("%d",&node[i].num);
    		   node[i].id=i;
    		   node[i].sta=-1;
    		   tot+=node[i].num;
    		}
    	if(tot%2==1)
    		printf("No\n");
    	else
    	{
    	    sort(node,node+n,cmp);
    	    long long int sum=0;
    		for(int i=0;i<n;i++)
    		{
            	if(sum+node[i].num==tot/2)
            	{
                    node[i].sta=1;
                    sum+=node[i].num;
                    break;
    		     }
    		     else if(sum+node[i].num<tot/2)
    		     {
    		     	node[i].sta=1;
                    sum+=node[i].num;
    		     }
            }
    	
    		if(sum==tot/2)
    		{
    		printf("Yes\n");
    		sort(node,node+n,cmp2);
    		printf("%d",node[0].sta);
    		for(int i=1;i<n;i++)
    		{
    			printf(" %d",node[i].sta);
    		}
    		printf("\n");
    		}
    		else
    		printf("No\n");
    	}
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/star_moon0309/article/details/80101116