您的位置:首页 > 其它

lightoj 1389 - Scarecrow 贪心

2016-04-13 12:24 330 查看
给定一个1*n的图,#代表坏的地,点代表庄稼,要放置稻草人防止乌鸦,一个稻草人可以保护本身和左右两端,问最少需要多少个稻草人。

三个点为一组。遇到一个#可能的情况是前面的点数量是三的倍数,刚好不用管,余数为2,那么就必须要放置一个啦。余数为1..有可能的情况是.#.或者.##,其实不管什么情况都是要放置一个的,直接跳过下个点,不管是啥都行。

我的代码最后要处理边界,其实在最后面加个#就可以不考虑边界了...

我看到题目的第一想法是DP....应该可解。

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define ull unsigned long long
#define mod 1000007
#define inf 0x3f3f3f3f
#define N 100100
using namespace std;
char s[200];
int main()
{
int t;
scanf("%d",&t);
for(int cas=1;cas<=t;cas++)
{
int n;
scanf("%d",&n);
scanf("%s",s);
int ans=0,cnt=0;
for(int i=0;i<n;i++)
{
if(s[i]=='.')
cnt++;
else
{
ans+=cnt/3;
cnt=cnt%3;
if(cnt==2)
ans++;
else if(cnt==1)
{
i++;
ans++;
}
cnt=0;
}
}
if(cnt)
ans+=cnt/3+(cnt%3?1:0);//剩余有cnt点没考虑
printf("Case %d: %d\n",cas,ans);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: