题目来源:http://community.topcoder.com/stat?c=problem_statement&pm=12581

Burte Force 算法,求解了所有了情况,注意 next_permutation 函数的用法。

#include <iostream>
#include <vector>
#include <limits>
#include <algorithm> using namespace std; class ColorTheCells
{
private:
vector <int> dryingTime; /* 需要干燥的时间 */
vector <long> dryedTime; /* 正好干燥的时间,0表示还没有paint */
vector <int> paint_order; /* paint格子的顺序 */
public:
long calc(int seq);
int minimalTime(vector <int> dryingTime);
}; #define MOVE_TIME 1L
#define PAINT_TIME 1L
#define INFINITY_TIME LONG_MAX /* 参考Ueddy代码实现 */
int ColorTheCells::minimalTime(vector<int> dryingTime)
{
int num = dryingTime.size();
long minTime = INFINITY_TIME;
int i, j; this->dryingTime = dryingTime;
paint_order.clear(); /* paint 的顺序 */
dryedTime.clear(); for (i = 0; i < num; i++) {
paint_order.push_back(i);
dryedTime.push_back(0);
} /* brute force,枚举所有的情况,选出最小时间 */
do {
for (i = 0; i < (1<<num); i++) {
for (j = 0; j < num; j++) {
dryedTime[j] = 0;
}
minTime = min(minTime, calc(i));
}
} while (next_permutation(paint_order.begin(), paint_order.end())); return minTime;
} /**
* seq为一个序列,0表示在被paint位置左边paint, 1表示在右边paint,paint的顺序由
* paint_order指定。
*/
long ColorTheCells::calc(int seq)
{
long time; /* 所用时间 */
int num = dryingTime.size();
int paint_dir; /* paint方向,在被paint位置左边还是右边paint */
int cur_pos; /* 当前位置 */
int paint_pos; /* paint位置,不是被paint的位置 */
int bias; /* 从当前位置向左走还是向右走 */ cur_pos = 0;
time = 0;
for (int i = 0; i < num; i++) {
paint_dir = seq & 1;
seq /= 2;
paint_dir = paint_dir ? 1 : -1;
paint_pos = paint_order[i] + paint_dir;
if (paint_pos < 0 || paint_pos >= num) { /* 位置不合法 */
return INFINITY_TIME;
} bias = 1; /* 从当前位置向右走 */
if (cur_pos - paint_pos > 0) { /* 从当前位置向左走 */
bias = -1;
} /* 用for循环到达paint位置,中间遇到还没有干燥的格子要等待 */
for (; cur_pos != paint_pos; cur_pos += bias) {
if (dryedTime[cur_pos+bias] > time) { /* 等待干燥 */
time = dryedTime[cur_pos+bias];
}
time += MOVE_TIME; /* 移动时间 */
}
time += PAINT_TIME; /* 到达目的地,paint时间 */
dryedTime[paint_order[i]] = time + dryingTime[paint_order[i]]; /* 更新该格子干燥时间 */
} return time;
}

SRM 582 Div II Level Three: ColorTheCells, Brute Force 算法的更多相关文章

  1. SRM 582 Div II Level One: SemiPerfectSquare

    题目来源:http://community.topcoder.com/stat?c=problem_statement&pm=12580 比较简单,代码如下: #include <ios ...

  2. SRM 582 Div II Level Two SpaceWarDiv2

    题目来源:http://community.topcoder.com/stat?c=problem_statement&pm=12556 #include <iostream> # ...

  3. SRM 212 Div II Level Two: WinningRecord,Brute Force

    题目来源:http://community.topcoder.com/stat?c=problem_statement&pm=3003&rd=5858 比较简单. 代码如下: #inc ...

  4. SRM 223 Div II Level Two: BlackAndRed,O(N)复杂度

    题目来源:http://community.topcoder.com/stat?c=problem_statement&pm=3457&rd=5869 解答分析:http://comm ...

  5. SRM 207 Div II Level Two: RegularSeason,字符串操作(sstream),多关键字排序(操作符重载)

    题目来源:http://community.topcoder.com/stat?c=problem_statement&pm=2866&rd=5853 主要是要对字符串的操作要熟悉,熟 ...

  6. SRM 577 Div II Level Two: EllysRoomAssignmentsDiv2

    题目来源: http://community.topcoder.com/tc?module=ProblemDetail&rd=15497&pm=12521 这个问题要注意的就是只需要直 ...

  7. SRM 583 Div II Level One:SwappingDigits

    题目来源:http://community.topcoder.com/stat?c=problem_statement&pm=12609 #include <iostream> # ...

  8. SRM 583 Div II Level Three:GameOnABoard,Dijkstra最短路径算法

    题目来源:http://community.topcoder.com/stat?c=problem_statement&pm=12556 用Dijkstra实现,之前用Floyd算法写了一个, ...

  9. SRM 219 Div II Level One: WaiterTipping,小心约分

    题目来源:http://community.topcoder.com/stat?c=problem_statement&pm=12609&rd=15503 这题目看上去so easy, ...

随机推荐

  1. MYSQL 备份用户权限

    MYSQL 备份用户权限 datadbblack 192.168.1.10 是 SELECT, RELOAD, SHOW DATABASES, LOCK TABLES  否 权限列表 1.Select ...

  2. 在线QQ客服

    代码一: <a target="_blank" href="http://wpa.qq.com/msgrd?v=3&uin=451314789&si ...

  3. 为什么使用LUT比GAL 节省资源

    为什么使用LUT比GAL 节省资源 A[1:0]    B[1:0]     实现一个比较器,如果A=B输出1 否则输出0 传统的GAL 需要 24= 16个存储单元(ROM)来存储结果数据,实现方法 ...

  4. java基础之junit测试框架

    1.导入junit包, 2.测试方法格式 public void test_*(){} 继承  TestCase  包(keep the bar green to keep the code clea ...

  5. JavaScript 、ECMAScript、commonJS 发展历史 与标准化发展

    本文介绍下JavaScript和 ECMAScript的诞生及发展历史,以及标准化过程. 一.JavaScript诞生 1994年,网景公司(Netscape)发布了Navigator浏览器0.9版. ...

  6. 设计模式(八)装饰器模式Decorator(结构型)

    设计模式(八)装饰器模式Decorator(结构型) 1. 概述 若你从事过面向对象开发,实现给一个类或对象增加行为,使用继承机制,这是所有面向对象语言的一个基本特性.如果已经存在的一个类缺少某些方法 ...

  7. NOI2015 寿司晚宴

    今年NOI确实是在下输了.最近想把当时不会做的题都写一下. 题意 从2到n(500)这些数字中,选若干分给A,若干分给B,满足不存在:A的某个数和B的某个数的GCD不等于1. 对于寿司晚宴这题,标准解 ...

  8. Use Node.js DDP Client on Arduino Yun to Access Meteor Server

    Use Node.js DDP Client on Arduino Yun to Access Meteor Server 概述 在Arduino Yun上安装 Node.js, 并測试与 Meteo ...

  9. PHP - 发送短信

    1.购买服务 我购买的是在百度进行推广的API服务.按照要求进行购买就好,之后获取自己的apikey. 2.将提供的代码修改后集成到项目中: <?php /** * * * 发送短信 * * * ...

  10. scanf()常犯错误

    ------------------------------------------------------------------------ <> 本意:接收字符串. 写成代码:voi ...