zoukankan      html  css  js  c++  java
  • [bzoj2529][Poi2011]Sticks_贪心

    Sticks bzoj-2529 Poi-2011

    题目大意:给你n根木棒,每种木棒有长度和颜色,颜色共有k种,求满足条件的3根木棒使得这3根木棒颜色互不相同且可以围成三角形。

    注释:$1le n le 10^6$,$1le kle 50$。

    想法:我们这么想:假设当前木棍是满足题意的三根木棍中的最大者,那么剩下两根木棍一定是越大越好。所以,将所有木棍按长度排序,每次记录一下连续的三个长度不同的三根木棍,然后比较。知道有答案位置。

    最后,附上丑陋的代码... ...

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    using namespace std;
    #define MAXN 1000010
    #define MAXM 1010
    struct Node
    {
    	int l;
    	int c;
    	friend bool operator <(const Node &x,const Node &y)
    	{
    		return x.l<y.l;
    	}
    };
    int k;
    int n,m;
    Node a[MAXN];
    int x,y,z,lx,ly,lz;
    Node ans[10];
    int main()
    {
    	scanf("%d",&k);
    	for(int i=1;i<=k;i++)
    	{
    		scanf("%d",&m);
    		for(int j=1;j<=m;j++)
    		{
    			a[++n].c=i;
    			scanf("%d",&a[n].l);
    		}
    	}
    	sort(a+1,a+n+1);
    	for(int j=1;j<=3;j++)
    	{
    		ans[j].l=ans[j].c=0;
    	}
    	for(int i=1;i<=n;i++)
    	{
    		bool flag=0;
    		for(int j=1;j<=3;j++)
    		{
    			if(ans[j].c==a[i].c)
    			{
    				ans[j].l=a[i].l;
    				flag=1;
    			}
    		}
    		if(!flag)
    		{
    			ans[1]=a[i];
    		}
    		sort(ans+1,ans+4);
    		if(ans[1].l+ans[2].l>ans[3].l&&ans[1].l!=0)
    		{
    			for(int j=1;j<=3;j++)
    			{
    				printf("%d %d ",ans[j].c,ans[j].l);
    			}
    			printf("
    ");
    			return 0;
    		}
    	}
    	printf("NIE
    ");
    	return 0;
    }
    

     小结:贪心思想有时是容易的,但是能不能想到贪心就看造化了... ...

  • 相关阅读:
    parted分区流程操作
    配置sudo命令行为审计
    sudo详细介绍
    groupadd(创建组)重要参数介绍
    useradd常用参数介绍
    /etc/default/useradd文件内容及对应功能
    linux基础正则
    centos 7.5 安装mongodb
    centos 7.5 安装mysql
    php删除制定文件及文件夹
  • 原文地址:https://www.cnblogs.com/ShuraK/p/9278817.html
Copyright © 2011-2022 走看看