Gym - 101097I Sticks(思维)

https://vjudge.net/contest/160830#problem/I

题意:给你一堆不同颜色的不同长度的棍,问你是否这些棍是否能够组成三角形且所有三角形的每个边的颜色都不相同。

思路:在添加三角形的边时,如果颜色相同就取最大的边,如果找的了三条边,就去比较第一以及第三条边和是否能够组成三角形,如果能直接输出,否则将第一条边等于第二条边,接着进行下一次判断。如果找不到输出NIL

 1 #include <iostream>
 2 #include <bits/stdc++.h>
 3 using namespace std;
 4 struct node
 5 {
 6     int data;
 7     int num;
 8 } a[1000005];
 9 int cmp(const node &p,const node &q)
10 {
11     return p.data<q.data;
12 }
13 int main()
14 {
15     freopen("sticks.in","r",stdin);
16     freopen("sticks.out","w",stdout);
17     int n,m,x;
18     scanf("%d",&n);
19     {
20         int cnt=0;
21         for(int i=1; i<=n; i++)
22         {
23             scanf("%d",&m);
24             for(int j=0; j<m; j++)
25             {
26                 cnt++;
27                 scanf("%d",&a[cnt].data);
28                 a[cnt].num=i;
29             }
30         }
31         sort(a+1,a+cnt+1,cmp);
32         for(int i=1,j=1,k=1; i<cnt-1;)
33         {
34             while(i<cnt&&a[i].num==a[i+1].num) i++;
35             j=i+1;
36             while(j<cnt&&a[j].num==a[j+1].num) j++;
37             k=j+1;
38             if(k<=cnt&&a[k].num!=a[i].num)
39             {
40                 if(a[i].data>a[k].data-a[j].data)
41                 {
42                     printf("%d %d %d %d %d %d\n",a[i].num,a[i].data,a[j].num,a[j].data,a[k].num,a[k].data);
43                     return 0;
44                 }
45             }
46             i=j;
47         }
48         printf("NIE\n");
49     }
50     return 0;
51 }
View Code

 

posted @ 2017-04-29 14:55  Wally的博客  阅读(193)  评论(0编辑  收藏  举报