题目链接
题意就是给你一堆线段,然后线段有长度和颜色,让你选三条组成一个三角形,这三条线段颜色不能一样
题解:
做法:贪心
首先按照长度给这些线段排序一遍
然后贪心的去选,对于已经选出来同种颜色的,就拿它去替换同种颜色
不然就替换最小的
这样都能为后面创造更多的选择
复杂度$O(n)$
#include <bits/stdc++.h> #define ll long long #define inf 0x3f3f3f3f #define il inline #define in(a) a=read() #define out(a) printf( "%d" , a ) #define outn(a) out(a),putchar(' ') #define I_int int inline I_int read() { I_int x = 0 , f = 1 ; char c = getchar() ; while( c < '0' || c > '9' ) { if( c == '-' ) f = -1 ; c = getchar() ; } while( c >= '0' && c <= '9' ) { x = (x << 1) + (x << 3) + c - 48 ; c = getchar() ; } return x * f ; } #undef I_int using namespace std ; #define N 1000100 int n , k = read() ; struct node { int val , col ; bool operator < ( const node &x ) const { return val < x.val ; } } a[ N ] , b[ 3 ] ; int main() { for( int i = 1 ; i <= k ; i ++ ) for( int j = 1 , m = read() ; j <= m ; j ++ ) a[ ++ n ].col = i , a[ n ].val = read() ; sort( a + 1 , a + n + 1 ) ; for( int i = 1 ; i <= n ; i ++ ) { bool flag = 0 ; for( int j = 0 ; j < 3 ; j ++ ) if( !flag && a[ i ].col == b[ j ].col ) b[ j ].val = a[ i ].val , flag = 1 ; if( !flag ) b[ 0 ] = a[ i ] ; sort( b , b + 3 ) ; if( b[ 0 ].col && b[ 0 ].val + b[ 1 ].val > b[ 2 ].val ) { for( int j = 0 ; j < 3 ; j ++ ) printf( "%d %d " , b[ j ].col , b[ j ].val ); return 0 ; } } puts("NIE") ; return 0 ; }