LOJ#2170. 「POI2011」木棍 Sticks
阿新 • • 發佈:2018-10-28
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 ) #defineoutn(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