【细节】HDU 3744——A Running Game

本文介绍了一个关于运动员在400米跑道上比赛排名合法性的算法实现。通过最小假设原理,对比运动员的位置,判断是否需要增加圈数来确保排名正确,并最终验证第一名运动员的总行程是否超过指定距离。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这个题其实并不难想,跑道长400M,给顶N米的总长度,M个运动员和他们的当前位置,允许套圈,问这个排名是否合法?大概思路就是最小假设,若第一名确实比第二名大,第二名确实比第三名大……则忽略之,若小,则前面的人加一圈。如此反复下去,判断第一名有没有超出给定的距离。结果加圈的时候出了一点问题,圈*400应该是全局变量的,比较的时候不能只比较前一个。

好吧,细节决定成败。

#include <iostream>
#include <algorithm>
using namespace std;

class runner
{
 public:
  int meter;
  int rank;
 
};

bool cmp(runner n1,runner n2)
{
 return n1.rank<n2.rank;
}

int main()
{
 int testcase;
 cin>>testcase;
 
 while(testcase--)
 {
  int taoquanshu=0;
  runner pack[115];
  int maxroute,yu;
  int athlete,distance;
  cin>>athlete>>distance;
  maxroute=(distance/400)-1;
  yu=distance%400;
  
  for(int i=0;i<athlete;i++)
  {
   cin>>pack[i].meter>>pack[i].rank;
  }
  
  sort(pack,pack+athlete,cmp);
  for(int j=0;j<athlete-1;j++)
  {
   if(pack[j].meter>pack[j+1].meter)
   {
    continue;
   }
   else
   {
    taoquanshu++;
   }
  }
  
   if((taoquanshu*400+pack[athlete-1].meter)>distance)
   {
    cout<<"NO"<<endl;
   }
   else
   {
    cout<<"YES"<<endl;
   }

  
  }
   return 0; 
 }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值