ZOJ 3829 模拟贪心
2024-08-31 07:37:22
2014牡丹江现场赛水题
给出波兰式,推断其是否合法。假设不合法有两种操作:
1:任何位置加一个数字或者操作符
2:随意两个位置的元素对调
贪心模拟就可以
先推断数字数是否大于操作符数,若不大于 ans+=sum2-sum1+1;新增加的数字所有放到左端。
然后从左到右遍历一遍。存储到当前位置为止,数字数和sum1。和操作数和sum2
若sum2>=1sum1。优先与队尾的数字对调,若没有则sum1++,表示在最左端加一个数字
#include "stdio.h"
#include "string.h"
int main()
{
int n,sum1,sum2,i,len,ans,j,ok;
char str[1010];
scanf("%d",&n);
while (n--)
{
scanf("%s",str);
sum1=sum2=0;
len=strlen(str);
for (i=0;str[i];i++)
if (str[i]=='*') sum2++;
else sum1++; if (sum2==0)
{
printf("0\n");
continue;
}
if (sum1==0)
{
printf("%d\n",sum2+1);
continue;
} ans=0;
if (sum1<=sum2)
{
ans+=sum2-sum1+1;
sum2=0;
sum1=ans;
}
else sum1=sum2=0; for (i=0;str[i];i++)
{
if (str[i]<='9' && str[i]>='1') {sum1++; continue;}
if (str[i]=='*') sum2++; if (sum1>sum2) continue;
else
{
ok=0;
for (j=len-1;j>i;j--)
if(str[j]<='9' && str[j]>='1')
{
ans++;
sum1++;
sum2--;
str[j]='*';
ok=1;
break;
}
if (ok==0)
{
if (i==0)
{
ans+=2;
sum1+=2;
}
else
{
ans++;
sum1++;
}
}
}
}
if (str[len-1]!='*') ans++;
printf("%d\n",ans);
}
return 0;
}
最新文章
- 编写Java应用程序。首先定义一个描述银行账户的Account类,包括成员变 量“账号”和“存款余额”,成员方法有“存款”、“取款”和“余额查询”。其次, 编写一个主类,在主类中测试Account类的功能
- -XX:PermSize -XX:MaxPermSize 永久区参数设置
- java 21 - 7 IO流小结的图解
- 分享:大晚上用自己的锤子手机跨系统刷MIUI,跌宕起伏啊!!
- Shell cmd set note
- MySQL(六) —— 运算符和函数
- MyFragment
- [五]SpringMvc学习-Restful风格实现
- 功能:使用QQ号登陆,并加上微信和短信提醒,是否增量备份可选,阿里大鱼短信发送开发与测试,聚合数据(用JSON发短信,比较清楚)
- 去掉ExpandableListView的箭头图标
- eclipse安卓引入库项目的正确方法
- CodeForces 696A Lorenzo Von Matterhorn (LCA + map)
- The META for Mobile terminal
- Threading.local
- 登录页面和FORM的职责不对称,处理方法,刷新工作流程
- python绝技-运用python成为顶级黑客源代码
- spring mvc的工作原理
- node.js 找不到 xxx 模块解决办法
- JVM GC-----4、finalize()方法
- (转载)深入了解MyBatis参数
热门文章
- android 分享到QQ空间的全部操作
- Linux 程序设计学习笔记----Linux下文件类型和属性管理
- Bash脚本中的操作符
- &;lt;LeetCode OJ&;gt; 100. Same Tree
- 0x28 IDA*
- bzoj5216: [Lydsy2017省队十连测]公路建设
- 使用dbms_metadata.get_ddl遇到ORA-31603
- checkbox改写
- centos 部署 .net core runtime 环境
- IIS之虚拟目录学习