USACO The Clocks 一种O(1)的算法

[USACO 1.4.2] The Clocks [题目描述] The Clocks 时钟 IOI'94 - Day 2 考虑将如此安排在一个 3 x3 行列中的九个时钟: 目标要找一个最小的移动顺序次将所有的指针指向12点。 下面原表格列出了9种不同的旋转指针的方法,每一种方法都叫一次移动。 选择1到9号移动方法,将会使在表格中对应的时钟的指针顺时针旋转90度。 移动方法 受影响的时钟 阅读详情

The Clocks
IOI'94 - Day 2
Consider nine clocks arranged in a 3x3 array thusly:
|-------|    |-------|    |-------|    
|       |    |       |    |   |   |    
|---O   |    |---O   |    |   O   |          
|       |    |       |    |       |           
|-------|    |-------|    |-------|    
    A            B            C

|-------|    |-------|    |-------|
|       |    |       |    |       |
|   O   |    |   O   |    |   O   |
|   |   |    |   |   |    |   |   |
|-------|    |-------|    |-------|
    D            E            F

|-------|    |-------|    |-------|
|       |    |       |    |       |
|   O   |    |   O---|    |   O   |
|   |   |    |       |    |   |   |
|-------|    |-------|    |-------|
    G            H            I

The goal is to find a minimal sequence of moves to return all the dials to 12 o'clock. Nine different ways to turn the dials on the clocks are supplied via a table below; each way is called a move. Select for each move a number 1 through 9 which will cause the dials of the affected clocks (see next table) to be turned 90 degrees clockwise.

MoveAffected clocks
1ABDE
2ABC
3BCEF
4ADG
5BDEFH
6CFI
7DEGH
8GHI
9EFHI

Example

Each number represents a time according to following table:
9 9 12       9 12 12       9 12 12        12 12 12      12 12 12 
6 6 6  5 ->  9  9  9  8->  9  9  9  4 ->  12  9  9  9-> 12 12 12 
6 3 6        6  6  6       9  9  9        12  9  9      12 12 12 

[But this might or might not be the `correct' answer; see below.]

PROGRAM NAME: clocks

INPUT FORMAT

Lines 1-3:Three lines of three space-separated numbers; each number represents the start time of one clock, 3, 6, 9, or 12. The ordering of the numbers corresponds to the first example above.

SAMPLE INPUT (file clocks.in)

9 9 12
6 6 6
6 3 6

OUTPUT FORMAT

A single line that contains a space separated list of the shortest sequence of moves (designated by numbers) which returns all the clocks to 12:00. If there is more than one solution, print the one which gives the lowest number when the moves are concatenated (e.g., 5 2 4 6 < 9 3 1 1).

SAMPLE OUTPUT (file clocks.out)

4 5 8 9

思路:9种操作中,没有一种是对单独一个钟进行旋转的,那么能否找到一种操作组合,这一操作组合使一个钟顺时针旋转90度?

设我们对操作i使用了a[i]次(0<=a[i]<=3,因为当a[i]=4时的效果和a[i]=0时一样),那么要只让时钟A顺时针旋转90度的话,由表知,有(a[1]+a[2]+a[4])%4=1,(a[1]+a[2]+a[3]+a[5])%4=0,...使用如下暴力代码可以得到全部的操作次数:

#include<cstdio>
#include<cstring>
#define For(x) for (a[x] = 0; a[x] < 4; ++a[x])
const char C[9][9] =
{
	"ABDE",
	"ABC",
	"BCEF",
	"ADG",
	"BDEFH",
	"CFI",
	"DEGH",
	"GHI",
	"EFHI"
};

bool clocks[9][9];
int a[9], cnt[9];

int main()
{
	puts("const int A[9][9] =\n{");
	int i, j, choose;
	for (i = 0; i < 9; ++i)
		for (j = 0; C[i][j]; ++j)
			clocks[i][C[i][j] - 'A'] = true;
	for (choose = 0; choose < 9; ++choose)
	{
		For(0)For(1)For(2)For(3)For(4)For(5)For(6)For(7)For(8)
		{
			memset(cnt, 0, sizeof(cnt));
			for (i = 0; i < 9; ++i)
				for (j = 0; j < 9; ++j)
					if (clocks[j][i]) cnt[i] += a[j];
			for (i = 0; i < 9; ++i)
			{
				if (i == choose)
				{
					if ((cnt[i] & 3) != 1) break;///x&3=x%4
				}
				else
				{
					if (cnt[i] & 3) break;
				}
			}
			if (i == 9)
			{
				putchar('{');
				for (i = 0; i < 8; ++i) printf("%d,", a[i]);
				printf("%d}%s", a[8], (choose == 8 ? "\n" : ",\n"));
				goto L;
			}
		}
L:
		;
	}
	puts("};");
	return 0;
}

随后使用之:

/*
ID: synapse cheng
PROG: clocks
LANG: C++
*/

/*
Executing...
   Test 1: TEST OK [0.000 secs, 3376 KB]
   Test 2: TEST OK [0.000 secs, 3376 KB]
   Test 3: TEST OK [0.000 secs, 3376 KB]
   Test 4: TEST OK [0.000 secs, 3376 KB]
   Test 5: TEST OK [0.000 secs, 3376 KB]
   Test 6: TEST OK [0.000 secs, 3376 KB]
   Test 7: TEST OK [0.000 secs, 3376 KB]
   Test 8: TEST OK [0.000 secs, 3376 KB]
   Test 9: TEST OK [0.000 secs, 3376 KB]

All tests OK.
*/

#include<cstdio>

const int A[9][9] =
{
	{3, 3, 3, 3, 3, 2, 3, 2, 0},
	{2, 3, 2, 3, 2, 3, 1, 0, 1},
	{3, 3, 3, 2, 3, 3, 0, 2, 3},
	{2, 3, 1, 3, 2, 0, 2, 3, 1},
	{2, 3, 2, 3, 1, 3, 2, 3, 2},
	{1, 3, 2, 0, 2, 3, 1, 3, 2},
	{3, 2, 0, 3, 3, 2, 3, 3, 3},
	{1, 0, 1, 3, 2, 3, 2, 3, 2},
	{0, 2, 3, 2, 3, 3, 3, 3, 3}
};

int main()
{
	freopen("clocks.in", "r", stdin);
	freopen("clocks.out", "w", stdout);
	int v[9] = {0}, i, j, k;
	for (i = 0; i < 9; i++)
	{
		scanf("%d", &k);
		for (j = 0; j < 9; j++) v[j] += (4 - k / 3) * A[i][j];
	}
	for (i = 0; i < 9; i++) v[i] &= 3;
	k = 0;
	for (i = 0; i < 9; i++)
		for (j = 0; j < v[i]; j++)
			if (!k) printf("%d", i + 1), k = 1;
			else printf(" %d", i + 1);
	putchar(10);
	return 0;
}

usaco时钟程序 USACO编程题中的一个,由一般方法编程,容易看懂,仅供交流。 立即下载

相关推荐

SGX软硬件栈(二)——硬件指令

硬件指令分为内核权限硬件指令和用户权限硬件指令。内核权限硬件指令指的是指令需要通过内核态下才能访问,缩写是ENCLS。用户权限硬件指令指的是指令用户态下便能访问,缩写是ENCLU。每一个具体的功能指令被称为叶功能,如EADD叶功能,因为叶功能之间的区分是硬件指令(如ENCLS指令:0x 0F 01 CF)的EAX值不同,因此ENCLS指令的EAX在输入时都是用作叶功能号。 内核权限硬件指令-ENCLS 如图2所示,SGX 1代指令中,ENCLS主要用于管理Enclave生命周期等。比如下文将介绍的Enc

小气球归来的博客 2890

USACO1.4 The Clocks 解题报告

第一次用BFS,以前只是会用递归的DFS搜索,这次对照着书,硬生生的把BFS打出来了,终于明白什么叫做复杂度了。 先上程序(很明显这题的BFS会很痛苦,因为第一层9个,第二层9×9,第三层9×9×9,大约到了8层的时候,无论是什么样的队列,还是堆栈都不崩溃了) 很悲惨,到了第三组数据的时候完全不可能通过了,队列溢出了。实在无法达到35亿的储存效果。希望和我一样遇到这个问题的小白注意一下子。

Panda_Ming 574

同花顺Supermind量化交易 风险控制建模--海龟交易法则

A.市场与标的海龟交易法则应用于流动性高的市场中,选择交易量较大的标的进行交易。本文以沪深300指数ETF为标的,构建海龟交易法则。B、仓位:仓位是海龟交易系统最核心的部分,通过ATR真实波幅指标来管理仓位。第一步:计算True Range,简称TR。TR = Max ( H−L , H−P , P−L ) ,其中H为当日日内最高价,L为当日日内最低价,P为前一日收盘价。第二步:计算ATRATR = mean ( TR , 20 ) , 即计算过去20天的TR的平均值,ATR是TR的移动平均值。

qq_22808537的博客 1497

section 1.4.2 The clocks

看着满眼的for 跪了,留作纪念吧 /* ID: forthee1 PROG: clocks LANG: C++ */ #include <fstream> using namespace std; int m1[3][3] = {{3,3,0},{3,3,0},{0,0,0}}; int m2[3][3] = {{3,3,3},{0,0,0},{0,0,0}};...

weixin_30307921的博客 190

STM32 FDCAN热插拔恢复机制与自动重发功能优化

本文深入分析了STM32 FDCAN在热插拔场景下触发bus-off状态导致通讯中断的根本原因,指出自动重发功能是问题关键。通过禁用自动重发、配置硬件自动恢复机制及优化总线参数,实现了FDCAN热插拔后的100%稳定恢复,为工业应用提供了可靠的CAN总线解决方案。

ice55的博客 687

全志D1s RISC-V开发板硬件设计与Linux启动全流程解析

RISC-V架构是当前国产嵌入式处理器演进的核心方向,其启动流程涵盖从BootROM、SPL到U-Boot及Linux内核的多级引导机制。理解该流程需掌握DDR初始化、设备树适配、电源时序控制等底层原理,技术价值在于构建可追溯、可调试、可量产的最小可行系统(MVS)。典型应用场景包括边缘AI推理终端、工业HMI和轻量级网关等对成本与开源性敏感的领域。本文以全志D1s平台为载体,深入剖析基于玄铁C906内核的RISC-V SoC在真实硬件上的启动验证、电源完整性设计与Linux全链路开源实践。

weixin_32306683的博客 360

[USACO] The Clocks [位操作 BFS]

思路: 位操作+广搜。 1到9个时钟,每个时钟状态用两位表示 ,共18位。即每个状态用一个int表示即可。 然后直接广搜,每个状态都是一个int型,每次某状态到达用一个hash表记录。 一次AC。 位操作写得很蛋疼,事后查了一下网上报告,好像没这么做的,就记录一下把。 /* ID:wuyanyi1 PROG:clocks LANG:C++ */ #include #inclu

Aszxqw 1129

SpringBoot 指标监控——Actuator

1、 访问:localhost:8000/actuator 设置健康监控显示具体情况 metrics http://localhost:8000/actuator/metrics/jvm.gc.live.data.size 定制化health信息 //利用构造器,在注册中心中添加cityService.saveCity.count指标 public CityServiceImpl(MeterRegistry meter...

weixin_44302046的博客 4631

美国血统(模板 二叉树)

描述 农夫约翰非常认真地对待他的奶牛们的血统。然而他不是一个真正优秀的记帐员。他把他的奶牛们的家谱作成二叉树,并且把二叉树以更线性 的”树的中序遍历“和”树的前序遍历“的符号加以记录而不是用图形的方法。 你的任务是在被给予奶牛家谱的”树中序遍历“和”树前序遍历“的符号后,创建奶牛家谱的”树的后序遍历“的符号。每一头奶牛的姓名被 译为一个唯一的字母。(你可能已经知道你可以在知道树的两种遍历以后可以经常地重建这棵树。)显然,这里的树不会有多余26个的顶点。 这是在样例输入和样例输出中的树的图形表达方式:

无知的渣渣的博客 685

TI C2000 DSP CLA实战:用F28069的协处理器实现ADC采样与PWM相位实时联动控制

本文详细介绍了如何利用TI C2000系列DSP的CLA协处理器在TMS320F28069上实现ADC采样与PWM相位的实时联动控制。通过CLA的零周期上下文切换和硬件级任务触发特性,显著提升了电机控制和数字电源应用的实时性能,特别适用于需要亚微秒级响应的场景。

weixin_30932215的博客 3968

【一看就会】Autoware.universe中静态绕障路线的生成逻辑

在路径行为规划中,前期根据地图和起点终点,生成了一组连续可行的路径段序列(lanelets),然后后续路径行为规划,又会进行起始点,终止点,避障绕障路径的路径规划,并且会调用route_handler中的函数,进行中心线生成,最后生成路径,后续再给速度行为规划进行速度规划。在autoware.universe的规划中,是基于规则的规划,而其中的规则又是为了解决不同场景的。而这些场景,大部分是为了解决路上障碍物(静态、动态、行人、车辆等等)。

weixin_48386130的博客 321

The Clocks

题目大意 现有9个钟,有以下移动方案。注:一次移动会移动15分钟。 移动方法 受影响的时钟 1 ABDE 2 ABC 3 BCEF 4 ADG 5 BDEFH 6 CFI 7 DEGH 8 GHI 9 EFHI 给你9个钟的时间,是指向3/6/9/12点钟方向

SportRiver的博客 1480

车载网络测试实操源码_使用CAPL脚本实现安全访问解锁,并模拟各种测试场景

在车载诊断中,我们经常会使用到安全访问解锁,常见的场景包括软件刷写前、通过2E服务写入某个DID前、通过31服务执行某个例程前等,都必须先通过27服务进行安全访问,解锁相应安全等级后才能执行上述操作。在开发调试或测试时,有时候需要模拟正常的安全解锁、安全访问秘钥错误、连续多次请求安全访问等,手动操作极为不便。本文将介绍如何使用CAPL脚本实现安全访问解锁,并模拟各种测试场景。

文章主要涉及嵌入式软件开发、测试、项目管理等,欢迎交流,共同进步。 1201

usaco 1.5.2 The Clocks

麻麻说,如果研究了三天还是不会做的话,就算了吧。恩。 The Clocks IOI'94 - Day 2 Consider nine clocks arranged in a 3x3 array thusly: |-------| |-------| |-------| | | | | | | | |---O

shshwdr的专栏 1315

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

USACO Section 1.4 The Clocks (clocks)

bfs+剪枝。 如果某个钟表状态在之前出现过那么就不需要再加入到队列中了。由于不会哈希所以开了个9维数组判重。 之前因为路径数组和clock数组合并在一起写了,结果一直内存超限。 这个题因为clock里面有个长度是10的数组所以在用路径的时候这个数组是没用的,所以这俩东西应该分开写。 总之这个WA,TLE,RE了N次。 /* ID:kkkwjx1 LANG:C++ TASK:clocks

Fighting 828

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

USACO 1.4 The Clocks

虽然很多方法都一个意思……但是我因为算错2^27,认为爆int就没用位运算……然后傻呼呼的居然在压十进制位在做BFS…… 在USACO上TLE,但是其他OJ一般卡时内能过…… 9个数字分解为0123,然后用一个9位数保存…… 大量时间浪费在拆解数字上…… /* TASK:clocks LANG:C++ */ #include #include #include #include

ACMer不要报考高校代码为13627的移通学院! 541

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

USACO The Clocks 所谓的广搜?

Problem Address:USACO 1.4 【前言】 这道题我一共提交了19次,终于在第19次的时候过掉了。 那个内流满面啊! 一直被不知名的错误羁绊着。 Execution error: Your program had this runtime error: Bad syscall #32000175 (RT_SIGPROCMASK) [emai

Human_CK的专栏 1596

USACO/clocks

http://www.nocow.cn/index.php/Translate:USACO/clocks BFS注意剪枝。 计算好数组类型和大小。 /* LANG: C++ PROG: clocks */ #include #include #include #include #include #include #include #include #include

Chromer_cn的专栏 949

【宽搜】The Clocks 时钟 (Usaco_Training 1.4)

The ClocksIOI'94 - Day 2 Consider nine clocks arranged in a 3x3 array thusly: |-------| |-------| |-------| | | | | | | | |---O | |---O | | O ...

diying4157的博客 356

USACO The Clocks

操作间没有次序关系,同一个操作最多重复3次。。。 可以直接暴力。。。 The Clocks IOI'94 - Day 2 Consider nine clocks arranged in a 3x3 array thusly: |-------| |-------| |-------| | | | | | | |

码代码的猿猿 1408

【USACO题库】1.4.2 The Clocks时钟.TJ

https://jzoj.net/junior/#contest/show/1232/11(下文题目描述还是原地址清楚) 考虑将如此安排在一个 3 x3 行列中的九个时钟: |——-| |——-| |——-|| | | | | | ||—O | |—O | | O || | | |

RainbowCrown_CGH's blog 1824

[USACO1.4] [IOI1994]时钟 The Clocks

每个函数都保持在20行以内,出锅的概率大大降低,编译样例无debug一遍过,这里不是说代码能力有多好,而是说,使用这个写法,会让自己思路更加清晰,一段时间内只关注一段逻辑,很多人代码debug不出来不是因为代码能力弱,反而是因为代码能力太强,像一个。这样的代码在自己脑子十分清晰的时候是可以码的飞起的,不过可能只有两天内的自己才能看懂,可能过了两天自己回头看的时候惊呼“我靠,什么shit”。bfs肯定是那个bfs,关键是状态的表示,可以用一个int来表示状态,这样转移的时候比较麻烦,也可以用。

NDCSID的博客 848

Usaco 1.4.2 时钟(The Clocks)

题目:  时钟 来源:  Usaco1.4.2 题目大意:  给定9个时钟,及转动方法,求一个最小的转动方案 移动方法  受影响的时钟 1        ABDE 2        ABC 3

慢慢前行,跨越预言 929

USACO The clocks, ariprog

先八卦几句。我们常说算法设计的目的是为了达到获得最优时空开销,嗯,直接点看,是这样的。不管现代计算机CPU有多快,内存可以大到哪里去,资源总归是有限的,物理学里面叫做什么熵熵熵的,俺大学专门挂科,也记不清了。既然资源有限,那么就一定得拼了老命滴想法子来在有限的资源上构建最佳的上层建筑,所谓最佳,就是前述所言之:最优时空开销。为了达到这个目的,就我目前浅薄的知识范围与领悟,一般有三种办法:l  从软件工程的角度进行系统设计;l  从数学的角度进行算法设计;l  从计算机组成原理的角度进行优化处理。每一项都是学

左手为你画情 1147

USACO section 1.4.2 The Clocks

USACO section 1.4.2 The Clocks 1. 这道题有好多种解法,看NOCOW,用枚举,DFS,BFS都能求解。我看到这个题的时候,连最基本的枚举怎么做都想不出来,差距呐。。。; 2. 我挑选了解题报告中代码最短的读懂然后写出来了: /...

dayong9372的博客 284
上一篇: Manacher 算法详解:O(n) 复杂度求最长回文子串
下一篇: SPOJ 345 Mixtures (区间DP&前缀数组)
synapse7
博客等级 码龄14年 432粉丝 701原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值