1. 程式人生 > >LOJ#2170. 「POI2011」木棍 Sticks

LOJ#2170. 「POI2011」木棍 Sticks

span code inf clu printf poi putc main %d

題目鏈接

題意就是給你一堆線段,然後線段有長度和顏色,讓你選三條組成一個三角形,這三條線段顏色不能一樣

題解:

做法:貪心

首先按照長度給這些線段排序一遍

然後貪心的去選,對於已經選出來同種顏色的,就拿它去替換同種顏色

不然就替換最小的

這樣都能為後面創造更多的選擇

復雜度$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(‘\n‘) #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 ; }

LOJ#2170. 「POI2011」木棍 Sticks