题目大意:一只青蛙要跳过河的对面去,现在河里已经有一些石头的分布,然后你可以在河里给出一些石头,以让青蛙可以跳过去,但是你想看青蛙尽可能多地条。青蛙又是聪明的。现在给你和的宽度、石头分布情况以及青蛙最大能跳多远。问你最多能看到青蛙跳多少次?
解题思路:下来看到题解就跪了,读了题第一感觉是贪心的。可是之前训练每次这样暴力求解都过不了,后边看题解不是什么巧妙的公式,就是什么结论的。所以心里已经暗示这可能不是贪心的,又看到board的过题率之低就更加肯定了。搞定I题那道BFS后,直接敲了两下这个就没信心敲下去了。后边的时间就演变为我们的排名从入围渐渐地滑出去了。看了解题报告后,心碎了。不带这样玩的,弄得这几天都没心情coding了,失之交臂,痛彻痛悟呀...估计很多人WA了,是因为没有排序,细节处也要特别注意吧,做法也是看了大神的题解的。详见code。
题目来源:http://acm.hdu.edu.cn/showproblem.php?pid=5037
code:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int MAXN = 200000+100;
int n,m,l,t,ans,cas,k;
int s[MAXN];
int main(){
cas=0;
scanf("%d",&t);
while(t--){
scanf("%d%d%d",&n,&m,&l);
for(int i=1;i<=n;++i)
scanf("%d",s+i);
s[0]=0;++n;
s[n]=m;++n;
sort(s,s+n);
k=l,ans=0;
for(int i=1;i<n;++i){
int x=(s[i]-s[i-1])%(l+1);
int y=(s[i]-s[i-1])/(l+1);
if(k+x>=l+1){
k=x;
ans+=y*2+1;
}
else{
k+=x;
ans+=y*2;
}
}
printf("Case #%d: %d\n",++cas,ans);
}
return 0;
}