2015年4月6日 星期一

[POI 18 Stage 3] Sticks

作法:

如果三角形的三邊長裡面,最大的數確定了,那麼剩下的兩個數必定越大越好。所以只要考慮枚舉每一個數當最大的數,然後找出其他顏色裡小於等於這個數的最大數,對於取出來的數字最大的前兩種顏色拿去和目前枚舉到的這個最大邊檢驗即可。

code :

#include<bits/stdc++.h>
using namespace std;
const int maxn=50+10 ;
 
int get(int x,const vector<int> &v)
{
    int id=upper_bound(v.begin(),v.end(),x)-v.begin()-1 ;
    return id==-1 ? -1 : v[id] ;
}
 
vector<int> v[maxn] ;
 
main()
{
    int n ; scanf("%d",&n) ;
    for(int i=1;i<=n;i++)
    {
        int m ; scanf("%d",&m) ;
        while(m--)
        {
            int x ; scanf("%d",&x) ;
            v[i].push_back(x) ;
        }
        sort(v[i].begin(),v[i].end()) ;
    }
    for(int i=1;i<=n;i++) for(int j=0;j<v[i].size();j++)
    {
        int x=v[i][j] , m1=-1 , m2=-1 , id1 , id2 ;
        for(int i2=1;i2<=n;i2++) if(i2!=i)
        {
            int tmp=get(x,v[i2]) ;
            if(tmp>=m1) m2=m1 , m1=tmp , id2=id1 , id1=i2 ;
            else if(tmp>=m2) m2=tmp , id2=i2 ;
        }
        if(m1+m2>x)
        {
            printf("%d %d %d %d %d %d\n",i,x,id1,m1,id2,m2) ;
            return 0 ;
        }
    }
    printf("NIE\n") ;
}
 

沒有留言:

張貼留言