练习赛一 E AlvinZH的儿时回忆——蛙声一片
2017-10-10 20:01
162 查看
AlvinZH的儿时回忆——蛙声一片
时间限制:1000ms 内存限制:65536kb通过率:24/28
(85.71%)正确率:24/93
(25.81%)
题目描述
AlvinZH的童年有很多回忆,这回他想起了故乡的夏夜:稻花香里说丰年,听取蛙声一片。三岁的AlvinZH在散步时走到了一条乡间小路,他想去抓青蛙呱呱呱叫的青蛙,可是单独的青蛙总能在AlvinZH伸手抓住它时向前跳开。AlvinZH继续往前走,每次失败后由于有些挫败感,下一次遇到青蛙他会忽略它(们),同时AlvinZH不是那种轻言放弃的孩子,再下次遇到时他鼓起勇气还是会去抓,他相信他总能抓到的:),直到他前面没有青蛙为止。
我们假设小路上(直线)随机分布着青蛙,且青蛙只在AlvinZH伸手快被抓时才会沿小路往前跳。注意:如果多只青蛙在同一位置,若AlvinZH刚刚经历失败,它们将一起被忽略;否则,只有跳的最远的青蛙(可能多只)可以跳出AlvinZH的魔爪,剩下的全部被抓。
AlvinZH从位置0出发,最后会走到前面没有青蛙为止,请计算出他从出发到停止所走过的路程以及他抓到的青蛙数。
输入
第一个数为数据组数T(0 < T ≤ 10)。每组数据第一行为小路上的青蛙数n(0<N ≤ 10^5)。
接下来的n行,每行包含两个整数pos和dis(0 ≤ pos ≤ 10^5,0 < dis ≤ 10^3),分别代表这些青蛙的初始位置和每次跳起的距离。
输出
对于每组数据,输出一行,两个整数,分别为AlvinZH走过的路程和他抓到的青蛙数。
输入样例
3 2 1 1 2 2 2 1 3 2 2 3 1 2 2 1 3 1
输出样例
2 0 7 0 7 1
样例解释
第一组:青蛙①从1跳至2,然后忽略在2的两只青蛙(①和②),结束。第二组:青蛙①从1跳至4,然后忽略在2的青蛙②,之后青蛙①又从4跳至7,然后忽略在7的青蛙①,结束。
第三组:青蛙①从1跳至3,然后忽略在2的青蛙②,之后两只青蛙(①和③)都在3,抓住青蛙③,青蛙①从3跳至5,然后青蛙①又从5跳至7,忽略在7的青蛙①,结束。
解析:
中型模拟。声明三个数组:cnt(记录每个位置上的青蛙数),maxDis(记录每个位置上青蛙能跳得最远的距离),maxCnt(记录每个位置上能跳最远距离的青蛙数)。
输入n个青蛙的位置(pos)和跳起距离(dis)时做以下处理:此位置上的青蛙数加一(cnt[pos]++),更新maxDis和maxCnt,记录当前青蛙所在最远距离ans_1。
设置标志值flag记录 AlvinZH的状态,初始为true,挫败时为false。声明s为当前位置,当没走到最远距离时(s <= ans_1),向前进一步(s++),若当前位置没有青蛙,继续前进,有青蛙时做以下处理:跳得最远的青蛙跳走,更新当前位置的cnt,这些青蛙跳到新的位置后,更新新位置的maxDis,cnt和maxCnt。记录此位置抓到的青蛙数ans_2。最后输出ans_1与ans_2即可。
代码:
#include<cstdio>
#include<algorithm>
#define maxn 2000007
using namespace std;
int cnt[maxn],maxDis[maxn],maxCnt[maxn];
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
int n;
scanf("%d",&n);
int ans_1 = 0;
for(int i = 0; i < n; i++)
{
int pos,dis;
scanf("%d%d",&pos,&dis);
cnt[pos]++;
if(maxDis[pos] < dis)
{
maxDis[pos] = dis;
maxCnt[pos] = 0;
}
if(maxDis[pos] == dis)
{
maxCnt[pos]++;
}
ans_1 = max(ans_1,pos);
}
bool flag = true;
int s = -1,ans_2 = 0;
while(s <= ans_1)
{
s++;
if(!cnt[s]) continue;
if(flag)
{
ans_1 = max(ans_1,s+maxDis[s]);
cnt[s+maxDis[s]] += maxCnt[s];
cnt[s] -= maxCnt[s];
if(maxDis[s+maxDis[s]] < maxDis[s])
{
maxDis[s+maxDis[s]] = maxDis[s];
maxCnt[s+maxDis[s]] = 0;
}
if(maxDis[s+maxDis[s]] == maxDis[s])
{
maxCnt[s+maxDis[s]] += maxCnt[s];
}
ans_2 += cnt[s];
if(!cnt[s])
{
flag = !flag;
}
}
else
{
flag = !flag;
}
}
for(int i = 0; i <= ans_1; i++)
{
cnt[i] = 0;
maxDis[i] = 0;
maxCnt[i] = 0;
}
printf("%d %d\n",ans_1,ans_2);
}
}
相关文章推荐
- 练习赛一 D AlvinZH的儿时回忆——跳房子
- 2016算法第一次练习赛——D AlvinZH的儿时回忆——跳房子
- 上机一 F AlvinZH的儿时梦想——木匠篇
- 追回儿时回忆 代购成人玩具
- “一带一路”与儿时的回忆
- 有幸重新体验了两件儿时的往事,勾起了一点回忆
- 回忆儿时的经典动画片
- 【诗歌】蛙声一片
- 儿时的回忆
- 儿时回忆—— 淘气的童年
- 儿时回忆—— 童年的美食
- 童年回忆:儿时 游戏 逮鱼
- 微风细雨,蛙声一片
- 向雷锋同志学习——我的儿时回忆
- 80年代的我们对儿时零食的回忆
- 总有一片爱情让你泪流满面(经典转载)
- 纪念逝去的回忆(2)。。。
- 提高团队整体能力-同一片天“技术交流会”
- PowerDesginer 初探(转载) 很不错的一片入门blog
- 小知识渗透贴(回忆过去知识贴)