题目概述

题目描述

给出若干木棍,每根木棍有特定的颜色和长度。问能否找到三条颜色不同的木棍构成一个三角形。 (注意这里所说的三角形面积要严格大于\(0\))

输入格式

第一行给出一个整数\(k\),表示颜色的种数。这k种颜色被标号为\(1\)至\(k\)。

接下来\(k\)行,第\(i+1\)描述颜色为\(i\)的木棍的信息。 首先一个整数\(N_i\)表示颜色为\(i\)的木棍的数量。

接下来\(N_i\)个整数,表示这\(N_i\)根木棍各自的长度。

输出格式

你的程序应该仅输出一行 如果有解,输出\(6\)个整数.

分别表示第一条边的颜色,第一条边的长度,第二条边的颜色,第二条边的长度, 第三条边的颜色,第三条边的长度.

这六个整数以空格分割。

如果有多组解,随便输出一组即可。

如果无解,输出\(NIE\)

样例输入

4 1 42
2 6 9
3 8 4 8
1 12

样例输出

3 8 2 9 4 12

数据范围

\[3 \le k \le 50 \\\\1 \le N_i \le 10^6 \\\\所有木棍的长度 \le 10^9 \\\\总木棍数量 \le 10^6 \\\\
\]


算法解析

题意理解

要你选择三根木棒,要求这三根木棒,颜色不同,而且可以构成三角形.

算法解析

这种题目,数据范围又大,而且只要找到任意一种合法方案,不难想到是贪心之类的乱搞算法.

首先,提取木棒信息.

  1. 长度
  2. 颜色

而且,在这里,长度显然是,第一关键字,因为首先要先构成三角形.

因此,我们不妨,先将,所有木棒都按长度排序

排好序后,我们发现,我们只需要在这个,木棒序列里面,找到三个不同颜色的数字

\[不妨设a,b,c为三根木棒的长度. \quad a<b<c \\\\因此我们只需要找到a+b>c的数对
\]

因为知道.

\[a<b<c
\]

那么显然,最有可能的一组就是.

\[a_{max},b_{max}
\]

因此此时,他们最有可能

\[a+b>c
\]

因此我们不妨设置如下贪心.

每次保存当前,三根颜色不同的前三大木棒

举个例子.

\[长度:1,2,2,3,4,5 \\\\颜色:x,y,y,z,z,z \\\\
\]

那么假如说,我们当前在序列最后一位,则

\[a=第一根木棒,(1,x) \\b=第三根木棒,(2,y) \\c=第六根木棒,(5,z) \\
\]

为什么是存储前三根颜色不同的木棒,而不是前两根.

因为长度排好序了,那么最大的木棒,一定就是当前这根木棒.

感谢GXZlegand大佬


代码解析

#include <bits/stdc++.h>
const int N=1000010;
using namespace std;
int n,t,tot,s1,s2,s3;
struct node
{
int c,l;
} a[N];
int cmp(node a,node b)
{
return a.l<b.l;
}
int main()
{
scanf("%d",&n);
for(int i=1; i<=n; i++)
{
scanf("%d",&t);
while(t--)
{
a[++tot].c=i;
scanf("%d",&a[tot].l);
}
}
sort(a+1,a+1+tot,cmp);
//s1为第一长木棒,s2为第二长,s3为第三长
for(int i=1; i<=tot; i++)
{
if(a[i].c==a[s1].c)//和最长的颜色相同,则原来最长的,变成了这根木棒
{
if(a[s3].l+a[s2].l>a[i].l)
{
printf("%d %d %d %d %d %d\n",a[s3].c,a[s3].l,a[s2].c,a[s2].l,a[i].c,a[i].l);
return 0;
}
s1=i;//最长的变了
}
else if(a[i].c==a[s2].c)//和次长的颜色相同
{
if(a[s3].l+a[s1].l>a[i].l)
{
printf("%d %d %d %d %d %d\n",a[s3].c,a[s3].l,a[s1].c,a[s1].l,a[i].c,a[i].l);
return 0;
}
s2=s1,s1=i;//原来最长的,成为现在次长的,同时最长的,改成这根木棒
}
else//和最短的颜色相同,切记这里最短是,相比较其他两根
{
if(a[s2].l+a[s1].l>a[i].l)
{
printf("%d %d %d %d %d %d\n",a[s2].c,a[s2].l,a[s1].c,a[s1].l,a[i].c,a[i].l);
return 0;
}
s3=s2,s2=s1,s1=i;//次长的成为最短,最长的成为了次长,最短成为了最长
}
}
puts("NIE");
return 0;
}

P3528 [POI2011]PAT-Sticks的更多相关文章

  1. BZOJ2529: [Poi2011]Sticks

    2529: [Poi2011]Sticks Time Limit: 10 Sec  Memory Limit: 128 MBSec  Special JudgeSubmit: 257  Solved: ...

  2. LOJ#2170. 「POI2011」木棍 Sticks

    题目链接 题意就是给你一堆线段,然后线段有长度和颜色,让你选三条组成一个三角形,这三条线段颜色不能一样 题解: 做法:贪心 首先按照长度给这些线段排序一遍 然后贪心的去选,对于已经选出来同种颜色的,就 ...

  3. BZOJ2529 [Poi2011]Sticks 【贪心】

    题目链接 BZOJ2529 题解 要组成三角形,当且仅当最长边长度小于另两条边之和 我们就枚举最长边,另两条边当然是越大越好 我们将所有边排序,从小枚举并记录各个颜色的最长边 当枚举到当前边时,找到除 ...

  4. 【bzoj2529】[Poi2011]Sticks 贪心

    题目描述 给出若干木棍,每根木棍有特定的颜色和长度.问能否找到三条颜色不同的木棍构成一个三角形.(注意这里所说的三角形面积要严格大于0) 输入 第一行给出一个整数k(3<=k<=50),表 ...

  5. BZOJ_2529_[Poi2011]Sticks_贪心

    BZOJ_2529_[Poi2011]Sticks_贪心 Description Little Johnny was given a birthday present by his grandpare ...

  6. POI2011题解

    POI2011题解 2214先咕一会... [BZOJ2212][POI2011]Tree Rotations 线段树合并模板题. #include<cstdio> #include< ...

  7. [bzoj2529][Poi2011]Sticks_贪心

    Sticks bzoj-2529 Poi-2011 题目大意:给你n根木棒,每种木棒有长度和颜色,颜色共有k种,求满足条件的3根木棒使得这3根木棒颜色互不相同且可以围成三角形. 注释:$1\le n ...

  8. 《转载》PAT 习题

    博客出处:http://blog.csdn.net/zhoufenqin/article/details/50497791 题目出处:https://www.patest.cn/contests/pa ...

  9. HDOJ 1051. Wooden Sticks 贪心 结构体排序

    Wooden Sticks Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) To ...

随机推荐

  1. 容器时代的持续交付工具---Drone:Drone使用

    上一篇文章里已经介绍了如何安装Drone,下面我们来看下如何使用.还是基于gogs作为git仓储. 首先打开server对应的地址,进入登录页面,输入在启动server时配置的管理员账号(对应的就是g ...

  2. appium(api操作)

    driver.current_activity #获取当前activity driver.current_package #获取包名 driver.lock(seconds=2) #息屏 #收起虚拟键 ...

  3. Apache服务器安装SSL证书

    Apache服务器安装SSL证书 在证书控制台下载Apache版本证书,下载到本地的是一个压缩文件,解压后里面包含_public.crt文件是证书文件,_chain.crt是证书链(中间证书)文件,. ...

  4. CF1187D Subarray Sorting

    思路: 线段树好题.对a数组中的每个元素从左到右依次操作,判断最终是否能够转化成b数组.在此过程中使用线段树维护区间最小值判断是否能够进行合法操作. 实现: #include <bits/std ...

  5. ztree点击节点实现选中/取消复选框

    效果 代码 在js中初始化tree时 设置复选框操作只影响子节点 复选框事件,想怎么处理就怎么处理

  6. oracle索引2

    问什么问题? 索引有什么代价?哪些场景下你需要建索引?或者有时候反过来问,哪些场景下不推荐建索引. 建好索引之后,怎么才能最高效地利用索引?或者反过来问,请说出一个无法有效利用已建索引的案例. 索引的 ...

  7. ES-实战

     一.环境准备 操作系统:mac 依赖的软件:JDK1.8.Postman.NodeJs6.0以上.Maven.Idea ES下载:Elastic官方网站: http://www.elastic.co ...

  8. Windows32或64位下载安装配置Spark

    [学习笔记] Windows 32或64位下载安装配置Spark:1)下载地址:http://spark.apache.org/downloads.html 马克-to-win @ 马克java社区: ...

  9. 如何理解归一化(Normalization)对于神经网络(深度学习)的帮助?

    如何理解归一化(Normalization)对于神经网络(深度学习)的帮助? 作者:知乎用户链接:https://www.zhihu.com/question/326034346/answer/730 ...

  10. nginx做为web容器部署静态资源以及做负载均衡反向代理实现

    需求:  此时前台开发完成打包生成静态资源文件,要做到以下方面: 使用nginx部署静态资源,同时nginx要实现端口转发,隐藏真实后台地址,同时后台需要做一个负载均衡. localhost:7001 ...