Throw nails
The annual school bicycle contest started. ZL is a student in this school. He is so boring because he can't ride a bike!! So he decided to interfere with the contest. He has got the players' information by previous contest video. A player can run F meters the first second, and then can run S meters every second.  Each player has a single straight runway. And ZL will throw a nail every second end to the farthest player's runway. After the "BOOM", this player will be eliminated. If more then one players are NO.1, he always choose the player who has the smallest ID.
 

Input

In the first line there is an integer T (T <= 20), indicates the number of test cases.  In each case, the first line contains one integer n (1 <= n <= 50000), which is the number of the players.  Then n lines follow, each contains two integers Fi(0 <= Fi <= 500), Si (0 < Si <= 100) of the ith player. Fi is the way can be run in first second and Si is the speed after one second .i is the player's ID start from 1.

Hint

Huge input, scanf is recommended.

Huge output, printf is recommended. 
 

Output

For each case, the output in the first line is "Case #c:".  c is the case number start from 1.  The second line output n number, separated by a space. The ith number is the player's ID who will be eliminated in ith second end. 
 

Sample Input

2
3
100 1
100 2
3 100
5
1 1
2 2
3 3
4 1
3 4
 

Sample Output

Case #1:
1 3 2
Case #2:
4 5 3 2 1
 
题意:有N个人跑步比赛,刚开始都有起始位置s和速度f,每秒淘汰一名选手(起始是第1秒,也算),淘汰跑在最前面的,如果有多个人跑在前面,则淘汰id值最小的。
解析:由于N很大,不可能每秒都模拟,但关注一下数据,起始位置s很小,想象一下,如果a的速度比b的速度多1,那么500+秒后不管a和b的起始位置如何,a一定在b前面。所以最多只用模拟前500秒(如果想保险,可以多加几次),如果还有剩下的选手,先按他们的速度排序,如果两个人的速度相同,则比较他们的当前的位置,否则比较id.
代码如下:
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<set>
#include<map>
#include<queue>
#include<vector>
#include<iterator>
#include<utility>
#include<sstream>
#include<iostream>
#include<cmath>
#include<stack>
using namespace std;
const int INF=1000000007;
const double eps=0.00000001;
const int maxn=50005;
int loc[maxn],speed[maxn];
int sum[maxn];
bool vis[maxn];
struct node
{
int now,s,id;
node(int now=0,int s=0,int id=0):now(now),s(s),id(id){}
bool operator < (const node& t) const
{
if(s!=t.s) return s>t.s; //比较速度
if(now!=t.now) return now>t.now; //当前位置
return id<t.id; //id
}
};
vector<node> save;
int main()
{
int T,Case=0;
cin>>T;
while(T--)
{
int N;
cin>>N; for(int i=1;i<=N;i++)
{
scanf("%d%d",&loc[i],&speed[i]);
sum[i]=loc[i]-speed[i]; //由于起始也要淘汰一名选手,所以先减掉,到后面开始模拟时加上即可
}
printf("Case #%d:\n",++Case);
memset(vis,false,sizeof(vis));
int kase=0; //方便打印加的一个标记
for(int i=1;i<=min(N,550);i++) //N可能比550小
{
int choose=-1,Max=-INF;
for(int j=1;j<=N;j++)
{
if(vis[j]) continue;
sum[j]+=speed[j];  
if(Max<sum[j]) Max=sum[j],choose=j;
}
vis[choose]=true;
if(kase++) printf(" ");
printf("%d",choose);
}
save.clear();
for(int i=1;i<=N;i++) if(!vis[i]) save.push_back(node(sum[i],speed[i],i)); // 剩余的选手
sort(save.begin(),save.end());
for(int i=0;i<save.size();i++)
{
if(kase++) printf(" ");
printf("%d",save[i].id);
}
printf("\n");
}
return 0;
}
 
 

hdu4393 Throw nails(只用模拟前面500来次,后面根据速度、位置、id值排序即可)的更多相关文章

  1. HDU 4393 Throw nails

    Throw nails Time Limit: 5000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  2. 刷题总结——Throw nails(hdu4393)

    题目: Problem Description The annual school bicycle contest started. ZL is a student in this school. H ...

  3. HDU 4393 Throw nails(贪心加模拟,追及问题)

    题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=115361#problem/D 题意大致是:给出最多50000个人,拥有最初速度 ...

  4. G - Throw nails

    来源hde4393 The annual school bicycle contest started. ZL is a student in this school. He is so boring ...

  5. hdu 4393 Throw nails(STL之优先队列)

    Problem Description The annual school bicycle contest started. ZL is a student in this school. He is ...

  6. 【HDOJ】4393 Throw nails

    水题,优先级队列. /* 4393 */ #include <iostream> #include <sstream> #include <string> #inc ...

  7. HDU 4393 Throw nails(优先队列)

    优先队列的应用 好坑,好坑,好坑,重要的事情说三遍! #include<iostream> #include<cstdio> #include<cstring> # ...

  8. 在线判题 (模拟)http://202.196.1.132/problem.php?id=1164

    #include<stdio.h> #include<math.h> #include<string.h> #include<stdlib.h> #de ...

  9. 【noip模拟赛4】找啊找啊找BF 拓扑排序

    描述 sqybi上次找GF的工作十分不成功,于是依旧单身的他在光棍节前的某天突发奇想,要给自己找一个BF(这里指的是男性的好朋友……),这样既可以和人分享内心的压抑(路人甲:压抑还分享么……),也可以 ...

随机推荐

  1. 关于链表的一些重要操作(Important operations on a Linked List)

    上篇博文中讨论了链表的一些基本操作: 链表的基本操作(Basic Operations on a Linked List) 然而,为创建一个多功能的链表,在深度学习之前我们还需要了解更多的链表操作. ...

  2. AsyncTask 与 对话框显示 view.WindowManager$BadTokenException: Unable to add window…is not valid; is your a

    最近遇到一个奇葩的问题,好郁闷 之前也没有仔细看.问题偶尔出现一次.再去查看日志时,出现 view.WindowManager$BadTokenException: Unable to add win ...

  3. 移动支付之智能IC卡与Android手机进行NFC通信

    本文来自http://blog.csdn.net/hellogv/ .引用必须注明出处.        眼下常见的智能IC卡执行着JavaCard虚拟机.智能IC卡上能够执行由精简后的Java语言编写 ...

  4. Android应用程序资源管理器(Asset Manager)的创建过程分析

    文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/8791064 在前面一篇文章中,我们分析了And ...

  5. 3. QT窗体间值的传递(续)

    一.前言 上篇博客中通过重载子窗体的构造函数将主窗体的值传入到子窗体,但是在子窗体运行过程中如何才能将值动态的传入到子窗体?可以有两种办法,1.信号和槽的方式传值:2.主窗体中将传出值设置为publi ...

  6. openssl 对称加密算法enc命令详解

    1.对称加密算法概述 openssl的加密算法库提供了丰富的对称加密算法,我们可以通过openssl提供的对称加密算法指令的方式使用,也可以通过调用openssl提供的API的方式使用. openss ...

  7. 自制获取data-自定义属性

    jQuery.fn.dataset = function(attr, val) { // 获取数据集 if (arguments.length == 0) { var dataset = {}; jQ ...

  8. OC——UIlabel text的常规应用

    UILabel *downloader = [[UILabel alloc]init]; NSString *downloadCount = [[LibraryArr objectAtIndex:in ...

  9. C学习笔记 - 指针

    指针与数组 ,,,,}; int *p; p = a; printf("*a = %d\n",*a); printf("*p = %d\n",*p); prin ...

  10. NOIP前模板整理

    图 最短路径 #include <queue> #define N 1000 typedef long long ll; using namespace std; int d[N], w[ ...