hdu 4585 shaolin (暴力)

来源:互联网 发布:惠州惠阳区网络问政 编辑:程序博客网 时间:2024/04/30 12:53
Sample Input
32 13 34 20
 

Sample Output
2 13 24 2
题意 :
每个和尚有个ID和战斗值,刚开始只有一个来和尚,id为1,战斗值为1000000000 ; 有n个新和尚,他可以与战斗值最接近的老和尚战斗,战斗完,新和尚变老和尚.输出每个新和尚和老和尚战斗的id:
暴力 : 全部数据按战斗值从小到大排序 .
#include<cstdio>#include<cstring>#include<map>#include<vector>#include<cmath>#include<cstdlib>#include<stack>#include<queue>#include<iostream>#include<algorithm>using namespace std ;struct node{int x,y;}a[100010];struct node1{int id,g,i ;}b[100010];int cmp(node1 a, node1 b){return a.g<b.g ;}int main(){int n,tt1,tt2;while(~scanf("%d",&n)){if(n==0) break ;memset(a,0,sizeof(a));for( int i = 0 ; i < n ; i++) {   scanf("%d%d",&b[i].id,&b[i].g);   b[i].i = i+2 ; //标记,是第几个和尚 } sort(b,b+n,cmp); b[n].id=1; //第一个老和尚战斗值最大,直接放最后b[n].g=1000000000 ;b[n].i=1;n++ ; for( int i = 0 ; i < n ; i++) //枚举每个和尚{         int t1=-1,t2=-1 ;for( int j=i+1 ; j < n ; j++) //找出后面第一个比i和尚先出现的和尚 { if( b[i].i > b[j].i)   {  t1 = b[j].id ;tt1=j; break ; }  }for( int j=i-1 ; j>=0 ; j--) //找出前面第一个比i和尚先出现的和尚{if( b[i].i > b[j].i)  {  t2 = b[j].id ; tt2=j ;break ; }}if( t1==-1&&t2!=-1) //只有一个比他先出现的和尚  {     a[b[i].i].x=b[i].id ; a[b[i].i].y=t2;  } else if( t1!=-1&&t2==-1)        {     a[b[i].i].x=b[i].id ; a[b[i].i].y=t1 ;  } else if(t1!=-1&&t2!=-1) //有两个,就比较谁更接近  {     if(b[i].g-b[tt2].g > b[tt1].g-b[i].g)       {  a[b[i].i].x=b[i].id ; a[b[i].i].y=t1 ; }     else if(b[i].g-b[tt2].g < b[tt1].g-b[i].g)     {  a[b[i].i].x=b[i].id ; a[b[i].i].y=t2 ; }     else        {   a[b[i].i].x=b[i].id ; a[b[i].i].y=t2 ; }      }}for( int i = 2 ; i <=n ; i++) printf("%d %d\n",a[i].x,a[i].y);}return 0;}
原创粉丝点击