hihocode #1313 : Treasure Boxes
2016-06-05 21:38
447 查看
时间限制: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。
保证洞穴中至少有一个箱子是装有宝物的。
输出一行表示最少需要几分钟。
样例输入
样例输出
EmacsNormalVim
贪心模拟,先判断是否全为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;
}
单点时限: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
EmacsNormalVim
贪心模拟,先判断是否全为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;
}
相关文章推荐
- 递归
- 中国剩余定理的解析及记忆(扩展欧几里得算法的运用)
- 素数表的快速建立,合数分解,1-2^31内某个长度小于10w的区间素数筛选的三个模板及解析
- 线段树3种基础模型的理解和记忆(任意区间求和,任意区间的所有数加上相同数(懒操作),任意区间所有数变成同一个值再求和)
- ZOJ 1610 Count the Colors 多次更新一次查询,只需要一一标记
- POJ 3264 Balanced Lineup 查询区间最大最小值 基础线状树水题
- HDU 1698 Just a Hook 线状树经典模型之区间变动bool标记,上下同时更新
- POJ 3468 A Simple Problem with Integers(线状树经典模型之lazy操作)
- POJ 2251 Dungeon Master 比较有趣的三维迷宫bfs搜索路径
- 论Acmer的自我修养 (算法学习目标和推荐题目)
- HDU 1260 Tickets (很简单的基础DP题,找到状态转移方程就直接AC了)
- HDU 1176 免费馅饼 (类似于数塔DP的题目,注意边界条件,细节处理)
- HDU 1114 Piggy-Bank (完全背包水题,但注意一下时间输出)
- HDU 1087 Super Jumping!Jumping!Jumping求连续上升子序列的最大和值 (解析)
- HDU 1069 Monkey and Banana 对比优先权的设置和排序问题(解析)
- HDU 1029 Ignatius and the Princess IV(动规水题,有个很精妙的快解法)
- HDU 1024 Max Sum Plus Plus求前n个数中的若干个数分为连续的m段的最大和值(解析)
- HDU2000
- HDU2003
- HDU1095