您的位置:首页 > 其它

zoj 3829 Known Notation The 2014 ACM-ICPC Asia Mudanjiang Regional Contest K 贪心

2014-10-16 19:55 543 查看
传送门:2014牡丹江区域赛K题

求数字与符号构成的字符串至少经过多少次操作可以变成一个合法的算术字符串。操作可以在任意位置添加数字或者交换任意两个字符的位置

贪心策略题。

首先,数字的总数至少应该比符号数多1,若不足则优先在整个字符串的开头补足这么多个数。

然后从字符串开头从头到尾扫一遍,遇到数字则当前的数字数加1,

遇到符号,如果当前数字数大于等于2,则数字数减1。否则进行一次换位操作,即当前统计的数字数加1,并且总的操作数加1。

不用担心之后遇到换位位置的数字重复统计的问题。因为优先补足了数字量,每次换位的时候都是优先把最靠后的数字换到前面,因此如果扫到某一位的数字已经是换过位的话,那么就说明当前的换位次数已经能够满足使得整个字符串合法了

/******************************************************
* File Name:   k.cpp
* Author:      kojimai
* Creater Time:2014年10月16日 星期四 19时49分44秒
******************************************************/

#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<iostream>
using namespace std;
#define FFF 1005
char s[FFF];
int main()
{
int keng;
scanf("%d",&keng);
while(keng--)
{
scanf("%s",s);
int cnt=1;
for(int i = 0;s[i] != '\0';i++)
{
if(s[i]=='*')
cnt++;
else
cnt--;
}
if(cnt<0)
cnt=0;
int ans=cnt,num=cnt;
for(int i=0;s[i]!='\0';i++)
{
if(s[i]=='*')
{
if(num>=2)
{
num--;
}
else
{
ans++;
num++;
}
}
else
num++;
}
cout<<ans<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐