AlvinZH的儿时回忆——蛙声一片
时间限制:1000ms 内存限制:65536kb
通过率:24/28 (85.71%)
正确率:24/93 (25.81%)
解析:
中型模拟。声明三个数组: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);
}
}