题目链接:http://codeforces.com/contest/379/problem/B

题目意思:给定一个有n个钱包的序列,其中第i个钱包需要投入ai个钱币,需要编写一个程序,使得在对第i个钱包不能连续投入两次钱币(其实对这句话理解得不是很好:Due to some technical malfunctions the robot cannot follow two "put a coin" instructions in a row。希望有错的话,大家能够指出)和只有三种操作:向左移动一步,向右移动一步和向当前位置投入钱币的条件下,输出把每个钱包需要投入的钱币数都完成的步骤。

一开始我的做法就是,输入每个钱包需要投入的钱币数时,先统计为0的钱包数,这样可避免为空时还需要投入钱币的情况。接着从左到右开始扫描,遇到需要投入钱币的钱包就投入一枚,而该钱包需要投入的钱币数就减1,继续向右移动,直到到达最后一个位置。紧接着是从右向左扫描,继续相同的操作.....直到所有钱包需要投入的钱币都为0就结束。

比较复杂

 #include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
using namespace std; const int maxn = + ;
int vis[maxn], a[maxn]; int main()
{
int n, i, cnt, tcnt;
while (scanf("%d", &n) != EOF)
{
memset(vis, , sizeof(vis));
cnt = ;
for (i = ; i <= n; i++)
{
scanf("%d", &a[i]);
if (a[i] == ) // 统计不需要投入钱币的钱包数
{
vis[i] = ;
cnt++;
}
}
int flag = ; // 1: 向右移动,0:向左移动
while (cnt < n)
{
tcnt = ; // 标记当前所处的位置
while (flag)
{
if (a[tcnt] && tcnt < n)
{
printf("P"); // 投入一枚钱币
a[tcnt]--; // 当前钱包需要的钱币减一枚
}
if (!a[tcnt] && !vis[tcnt]) // 当前钱包投入一枚钱币之后刚好不再需要再投入钱币
{
vis[tcnt] = ;
cnt++;
}
if (cnt == n) // 所有钱包都不需要投入钱币
break;
tcnt++;
if (tcnt <= n) // 向右移动
printf("R");
else
flag = ; // 设为向左移动的标志
}
if (cnt == n)
break;
tcnt = n;
while (!flag)
{
if (a[tcnt] && tcnt > )
{
printf("P");
a[tcnt]--;
}
if (!a[tcnt] && !vis[tcnt])
{
vis[tcnt] = ;
cnt++;
}
if (cnt == n)
break;
tcnt--;
if (tcnt >= )
printf("L");
else
flag = ;
}
}
printf("\n");
}
return ;
}

以下是参考别人的代码再写的,可谓是真正实现了“构造法”的思想啊~~~边输入边处理,内存空间也省了。

 #include <iostream>
#include <cstdio>
#include <cstdlib>
using namespace std; int main()
{
int n, i, j, tmp;
while (scanf("%d", &n) != EOF)
{
for (i = ; i < n; i++)
{
scanf("%d", &tmp);
if (i)
printf("R"); // 除最左边的那个位置外,其余位置都需要从当前位置向右移动一位
for (j = ; j < tmp; j++) // tmp为0的时候不处理
{
printf("P");
if (i)
printf("LR"); // 防止右边越界,都要向左移,接着回归当前位置
else
printf("RL"); // 最左边的那个位置的特殊处理
}
}
printf("\n");
}
return ;
}

最新文章

  1. iOS 语音朗读
  2. VB的try语句,异常处理
  3. 如何使用strace+pstack利器分析程序性能
  4. IOS基础框架
  5. JS选择checkbox
  6. Windows - 程序猿应该熟记的CMD常用命令
  7. EasyUI两种动态添加tab Iframe页面的方法
  8. Chapter 1 Securing Your Server and Network(3):使用托管服务帐号
  9. SQL并发处理方案——乐观锁和悲观锁
  10. unity 之 no cameras rendering
  11. jenkins执行shell提示命令不存在
  12. 第11章 拾遗5:IPv6和IPv4共存技术(3)_NAT-PT技术【全书完】
  13. 如何使用Python对Instagram进行数据分析?
  14. 犯罪心理第一季/全集Criminal Minds迅雷下载
  15. Using curl to upload POST data with files
  16. CSS中表示大小的单位
  17. MySQL的各种SHOW
  18. 7.25 10figting!
  19. Java 子类父类构造方法执行顺序
  20. 【BZOJ】1612: [Usaco2008 Jan]Cow Contest奶牛的比赛(floyd/dfs)

热门文章

  1. Bringing up interface eth0: Error:Connection activation failed:Device not managed by NetworkManager
  2. Xcode的一些有用的插件
  3. php中图片文件的导入,上传与下载
  4. WinForm AutoComplete 输入提示、自动补全
  5. 32和64位的CentOS 6.0下 安装 Mono 2.10.8 和Jexus 5.0
  6. webservice和restful的区别
  7. LinkedList和ArrayList的区别/何时使用LinkedList和ArrayList
  8. 用java做的免费投票器/软件/工具 可定制
  9. 新浪微博客户端(13)-使用UIWebView加载OAuth授权界面
  10. 转:Java NIO系列教程(六) File Channel