ZOJ 3829 模拟贪心

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;
}
时间: 2024-10-13 08:58:06

ZOJ 3829 模拟贪心的相关文章

HDU 4903 (模拟+贪心)

Fighting the Landlords Problem Description Fighting the Landlords is a card game which has been a heat for years in China. The game goes with the 54 poker cards for 3 players, where the “Landlord” has 20 cards and the other two (the “Farmers”) have 1

ZOJ 3674 模拟

[题意]:若干组数据 每组给一个整数n代表n个名词(单词),接下来1-n给出一个单词和一行注释(一行注释由多个字符串组成),然后给出一个整数m,接下来1-m 每行若干个单词来自(1-n),要求出这若干个单词共有的注释字符串并按字典序排列输出,若不存在则输出NO. Sample Input 4 fish agile animal horse swift animal eagle fierce animal Kyuubee alien incubator 2 fish horse eagle fis

UVA-11054-Wine trading in Gergovia(模拟+贪心)

首先这道题的节点数太多了,达到10^5,所以不能用数组模拟啊,肯定TLE,所以用贪心算法,读取第一个结点,搬到第二个结点,剩下的和第二个结点合并,一起搬到第三个结点......这个算法很好,每次看成只是邻居间买卖,下面是代码: #include<stdio.h> #include<iostream> #include<stdlib.h> using namespace std; int main() { int n; while(cin>>n &&a

[贪心+模拟] zoj 3829 Known Notation

题目链接: http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=5383 Known Notation Time Limit: 2 Seconds      Memory Limit: 65536 KB Do you know reverse Polish notation (RPN)? It is a known notation in the area of mathematics and computer science.

ZOJ - 3829 Known Notation(模拟+贪心)

http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3829 给定一个字符串(只包含数字和星号)可以在字符串的任意位置添加一个数字,还可以交换任意两个字符,问需要多少步能得到一个合法后缀表达式. 如果数字<星号+1 那么必须要添加数字,那么肯定是添加在字符串前面是最优的,然后从头到尾扫描整个串,如果遇到星号并且前面出现的数字>=2 数字减1,否则就要从后往前找第一个非*的数字然后与星号交换. 注意全为数字的情况,和处理完后字

ZOJ 3829 贪心 思维题

http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3829 现场做这道题的时候,感觉是思维题,自己智商不够,不敢搞,想着队友智商好,他们搞吧,但是没出来这题...... 以后任何时候,都自信点....该想的还是好好自己想,这类题感觉就是先去找性质,然后一点点找规律,如果必要的话,自己提出一点猜想,然后如果自己举不出来反例,就暂时认为是正确的 下午搞了一下午,发现还是悲剧,晚上参考了两个题解 http://blog.csdn.

ZOJ 3829 Known Notation 贪心

主要的贪心思想就是,如果有一个不合法的*,那么再他前面加1或者2个数字的花费是不可能小于把它和后面的数字交换的,所以把不合法星号尽可能的往后放即可. 这里我因为懒得特判,把每个情况都算了,不过n只有1000,n^2也是可以接受的. #include <cstdio> #include <cstring> #include <algorithm> #include <queue> #include <stack> #include <map&

【贪心+一点小思路】Zoj - 3829 Known Notation

借用别人一句话,还以为是个高贵的dp... ... 一打眼一看是波兰式的题,有点懵还以为要用后缀表达式或者dp以下什么什么的,比赛后半阶段才开始仔细研究这题发现贪心就能搞,奈何读错题了!!交换的时候可以任意两个字符交换然而就那么看成了只能相邻的数字字符与'*'字符交换....../(ㄒoㄒ)/~~...但赛后补题的时候发现细节考虑的不好,还是应该锻炼下自己的逻辑整理... 怎么贪咧... 第一步,全数字串即合法,直接输出0即可: 第二步,数字不够的话要添.所谓数字够,即数字的个数至少要比星号个数

ZOJ 3829 Known Notation --贪心+找规律

题意:给出一个字符串,有两种操作: 1.插入一个数字  2.交换两个字符   问最少多少步可以把该字符串变为一个后缀表达式(操作符只有*). 解法:仔细观察,发现如果数字够的话根本不用插入,数字够的最低标准为'*'的个数+1,因为最优是 '12*3*..' 这种形式,所以先判断够不够,不够就补,然后从左往右扫一遍,如果某个时刻Star+1>Num,那么从开始到这一段是不合法的,要把那个'*'与后面的一个数字交换,此时Star--,Num++.然后步数++.这样得出的结果就是最后的最小步数. 脑子