hihocode #1313 : Treasure Boxes

时间限制: 20000ms
单点时限: 1000ms
内存限制: 256MB

描述

ZZX走进了一个神秘的洞穴。在他面前摆放着 k 堆箱子,其中第 i 堆中有 a[i] 个箱子,这 a[i] 个箱子从底向上堆叠成一座塔的形状。

ZZX知道这些箱子中有一些是装满宝物的宝箱,而剩下的箱子中只装着废铜烂铁。

现在他希望将所有的宝箱都搬到车上运走,而剩下的箱子都留在洞穴中。

ZZX每次可以执行两种操作之一,花费一分钟的时间:

操作1:对于 i ≠ j,将第 i 堆最顶部的那个箱子搬到第 j 堆的顶部。(第 j 堆允许是空的,这时箱子会被搬到第 j 堆所在位置的地面上)

操作2:对于 i,如果第 i 堆最顶部的箱子是宝箱,那么他可以把这个箱子搬到车上。

现在请你帮助ZZX计算完成任务所需要花费的最少时间。

输入

第一行一个整数 k。(2 ≤ k ≤ 100)

接下来 k 行,每行一个由'o'和'x'组成的非空字符串,表示一堆箱子,最左边的字符表示底部的箱子,最右边的字符表示顶部的箱子,'o'表示装有宝物的箱子,'x'表示没有宝物的箱子。每行字符串长度不超过100。

保证洞穴中至少有一个箱子是装有宝物的。

输出

输出一行表示最少需要几分钟。

样例解释

time 0:
oxx
ox
xoxox

time 1:
oxxx
o
xoxox

time 2:
oxxx
(empty)
xoxox

time 3:
oxx
x
xoxox

time 4:
ox
xx
xoxox

time 5:
o
xxx
xoxox

time 6:
(empty)
xxx
xoxox

time 7:
x
xxx
xoxo

time 8:
x
xxx
xox

time 9:
x
xxxx
xo

time 10:
x
xxxx
x
样例输入
3
oxx
ox
xoxox
样例输出
10





贪心模拟,先判断是否全为x或者全为o 然后找出每一行第一个o的后面的最少的x个数,先移动那行。剩下的答案就是l-第一个o的位置+第一次移动的x个数

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdio>
#include<math.h>
#include<algorithm>
#define esp 1e-8
using namespace std;
int main()
{
    char s[105][105];
    int k;
    while(cin>>k)
    {
        int i,j;
        for(i=0; i<k; i++)
            cin>>s[i];
        int ok=0;
        for(i=0; i<k; i++)
        {
            int l=strlen(s[i]);
            int po=0;
            int op=0;
            for(j=0; j<l; j++)
                if(s[i][j]=='o')
                    po++;
                else
                    op++;
            if(po==l || op==l)
                ok=1;
        }
        if(ok)
        {
            int sum=0;
            for(i=0; i<k; i++)
            {
                int l=strlen(s[i]);
                for(j=0; j<l; j++)
                    if(s[i][j]=='o')
                    {
                        sum+=l-j;
                        break;
                    }
            }
            cout<<sum<<endl;
        }
        else
        {
            int min1=1000;
            int x;
            int sum;
            for(i=0; i<k; i++)
            {
                int l=strlen(s[i]);
                int sss=0;
                for(j=0; j<l; j++)
                {
                    if(s[i][j]=='o')
                    {
                        for(int ii=j+1; ii<l; ii++)
                        {
                            if(s[i][ii]=='x')
                                sss++;
                        }
                        if(sss<min1)
                        {
                            min1=sss;
                            sum=l-j;
                            x=i;
                        }
                        break;
                    }
                }
            }
            int ans=0;
            ans+=min1;
            ans+=sum;
            for(i=0; i<k; i++)
            {
                int l=strlen(s[i]);
                if(i!=x)
                    for(j=0; j<l; j++)
                        if(s[i][j]=='o')
                        {
                            ans+=l-j;
                            break;
                        }
            }
            cout<<ans<<endl;
        }
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值