usaco2.2 lamps

STM32F103串口DMA收发与空闲中断实战:零CPU占用不定长数据方案 串口通信是嵌入式开发的基础,而DMA(直接存储器访问)与空闲中断(IDLE)的结合,能显著降低CPU负载,实现高效的不定长数据收发。其原理在于DMA自动搬运数据,空闲中断精准识别帧结束,从而释放CPU资源。这种技术方案在Modbus RTU、GPS解析等场景中价值巨大,尤其适合STM32F103等资源受限的芯片。本文基于标准外设库(SPL),详细解析DMA收发配置、空闲中断处理及缓冲区设计,提供一套可直接移植的工程实践代码,帮助开发者彻底解决串口高负载下的丢包与效率问题。 阅读详情

题目链接


(最近以来好不容易让我感到自己智商上线的一道题(叹


题意:

最初的状态是 1-N 灯全开着

接下来进行一系列(4种)操作(操作次数 C 多达 1w)

1:将所有灯的状态反转

2:将偶数号的状态反转

3:将奇数号的状态反转

4:将 3k+1 号的状态反转

得到最终状态

现给出最终状态中的 一些 灯的状态

求所有可能的最终状态,并升序排列


思路:

无脑递归显然不可行,10000 层递归显然是开玩笑

那么肯定有什么聪明的办法


显然,操作的最终状态与操作顺序无关

设四种步骤的操作数分别为 a, b, c, d

则我们有 

a * step1 + b * step2 + c* step3 + d * step4 == FinalState - InitialState;

a + b + c + d == n;

(stepi 都是 01 位串

(第一个等式意思意思写得不严谨,大概含义就是 每一位上 进行的 所有的操作 累加起来的 1 的总和(模上一个2) 导致的这一位发生的改变,即为最终状态与起始状态之间的改变((当然只需要检查那些给定状态的位

写到这里我们很容易就能发现,对于每个 stepi,一旦进行两次,%2 之后改变量就全是 0,就相当于什么都没做

所以我们可以将第一个式子变为

a%2 * step1 + b%2 * step2 + c%2 * step3 + d%2 * step4 == FinalState - InitialState;

也就是说,对于每一个 stepi 都只有进行和不进行的两种情况,总共也就只有 2^4 = 16 种情况

另外因为我们是两个两个抵消的,还要满足的一个要求就是 (n - ∑ step) % 2 == 0; 或者也可以 ∑ step <= n;


说到这里,怎么做就很显然了


AC代码如下:

(末尾有和 ANALYSIS 的对比反思)

/*
PROB: lamps
LANG: C++
ID: fan_0111
*/
#include <iostream>
#include <cstdio>
#include <string>
#include <algorithm>
using namespace std;
int pos[110], line[110], sum[110], change[4][110], step[4], ans[110];
string s[100010];
int tot = 0, c, n;
void in(int state) {
	int x;
	while (cin >> x && x != -1) {
		pos[tot++] = x;
		line[x] = state;
	}
}
bool check1() {
	for (int i = 0; i < tot; ++i) {
		if (line[pos[i]] != (sum[pos[i]] & 1)) return false;
	}
	return true;
}
bool check2() {
	int Step = step[0] + step[1] + step[2] + step[3];
	return !(((c - step[0] - step[1] - step[2] - step[3]) & 1) || Step > c);
}
void modify(int x, int sign) {
	for (int i = 1; i <= n; ++i) {
		sum[i] += change[x][i] * sign;
	}
}
void dfs(int x, int choice, int& totAns) {
	step[x] = choice;
	if (x == 3) {
		if (check1() && check2()) {
			for (int i = 1; i <= n; ++i) ans[i] = 1;
			for (int i = 0; i < 4; ++i) {
				if (step[i] == 0) continue;
				for (int j = 1; j <= n; ++j) {
					ans[j] = (ans[j] + change[i][j]) % 2;
				}
			}
			for (int i = 1; i <= n; ++i) {
				s[totAns] += ans[i] + '0';
			}
			++totAns;
		}
		return;
	}
	dfs(x+1, 0, totAns);
	modify(x+1, 1);
	dfs(x+1, 1, totAns);
	modify(x+1, -1);
}
int main() {
	freopen("lamps.in", "r", stdin);
	freopen("lamps.out", "w", stdout);
	cin >> n >> c;
	in(0);
	in(1);
	sort(pos, pos+tot);
	for (int i = 1; i <= n; ++i)	change[0][i] = 1;
	for (int i = 1; i <= n; i += 2) change[1][i] = 1;
	for (int i = 2; i <= n; i += 2) change[2][i] = 1;
	for (int i = 1; i <= n; i += 3) change[3][i] = 1;
	
	int totAns = 0;
	dfs(0, 0, totAns);
	modify(0, 1);
	dfs(0, 1, totAns);
	sort(s, s+totAns);
	
	if (totAns == 0) cout << "IMPOSSIBLE\n";
	else {
		for (int i = 0; i < totAns; ++i) {
			cout << s[i] << endl;
		}
	}
	fclose(stdin);
	fclose(stdout);
	return 0;
}


后来看了 ANALYSIS, 发现除了这个以外,还可以有一个优化

那就是事实上我们这里的所有操作,产生的效果其实是 每 6 位一循环的

所以我们可以只看前 6 位的状态,而不是去看 N 位

这里的 N (10-100) 还比较小,如果大一点的话,可能就会被卡掉了

所以只看 6 位是一个很有意义的优化


并且 ANALYSIS 里的代码用了很多位运算

比我用数组去存很多东西,最后对 01 位串的字符串去排序的做法高明了很多

很值得学习


还有就是 ANALYSIS 里的递归,也和我用的不一样

我是对每个 step 去递归取货不取,就像是 打印一个集合的全部子集 的做法一样

先对不取 dfs,加进了取的状况,再 dfs

而 ANALYSIS 里先是规定一些给定的步数情况(这是可以做到的),对还剩余的步骤数可以取什么进行 dfs,也是一个很常规的思路


总得来说觉得 ANALYSIS 里的代码写得还是很美的

附上 ANALYSIS 代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>

#define MAXLAMP	6
#define LAMPMASK	((1<<MAXLAMP)-1)

int nlamp;
int nswitch;
int ison;
int known;

int poss[1<<MAXLAMP];

int flip[4] = {
    LAMPMASK,		/* flip all lights */
    LAMPMASK & 0xAA, 	/* flip odd lights */
    LAMPMASK & 0x55,	/* flip even lights */
    LAMPMASK & ((1<<(MAXLAMP-1))|(1<<(MAXLAMP-4)))	/* lights 1, 4 */
};

/*
 * Starting with current light state ``lights'', flip exactly n switches
 * with number >= i.
 */
void
search(int lights, int i, int n)
{
    if(n == 0) {
	if((lights & known) == ison)
	    poss[lights] = 1;
	return;
    }

    for(; i<4; i++)
	search(lights ^ flip[i], i+1, n-1);
}

void
printseq(FILE *fout, int lights)
{
    int i;
    char s[100+1];

    for(i=0; i<nlamp; i++)
	s[i] = (lights & (1<<(MAXLAMP-1 - i%MAXLAMP))) ? '1' : '0';
    s[nlamp] = '\0';
    fprintf(fout, "%s\n", s);
}

void
main(void)
{
    FILE *fin, *fout;
    int a, i, impossible;

    fin = fopen("lamps.in", "r");
    fout = fopen("lamps.out", "w");
    assert(fin != NULL && fout != NULL);

    fscanf(fin, "%d %d", &nlamp, &nswitch);

    for(;;) {
	fscanf(fin, "%d", &a);
	if(a == -1)
	    break;
	a = MAXLAMP-1 - (a-1) % MAXLAMP;
	ison |= 1<<a;
	known |= 1<<a;
    }

    for(;;) {
	fscanf(fin, "%d", &a);
	if(a == -1)
	    break;
	a = MAXLAMP-1 - (a-1) % MAXLAMP;
	assert((ison & (1<<a)) == 0);
	known |= 1<<a;
    }

    if(nswitch > 4)
	if(nswitch%2 == 0)
	    nswitch = 4;
	else
	    nswitch = 3;

    for(; nswitch >= 0; nswitch -= 2)
	    search(LAMPMASK, 0, nswitch);

    impossible = 1;
    for(i=0; i<(1<<MAXLAMP); i++) {
	if(poss[i]) {
	    printseq(fout, i);
	    impossible = 0;
	}
    }
    if(impossible)
	fprintf(fout, "IMPOSSIBLE\n");

    exit(0);
}


【USACO题库】2.2.4 Party Lamps派对灯 【USACO题库】2.2.4 Party Lamps派对灯 (File IO): input:lamps.in output:lamps.out 题目描述 在IOI98的节日宴会上,我们有N(10<=N<=100)盏彩色灯,他们分别从1到N被标上号码。 这些灯都连接到四个按钮: 按钮1:当按下此按钮,将改变所有的灯:本来亮着的灯就熄灭,本来是关着的灯被点亮。 按钮2:当按下此按钮,将改变所有奇数号的灯。 按钮3:当按下此按钮,将改变所有偶数号的灯。 按钮4:当按下此按钮,将改变所有序号是3*K+ 阅读详情

相关推荐

完整的申请邓白氏编码的流程(手把手教你申请邓白氏编码)

申请公司的苹果开发者账号和企业级的苹果开发者账号时,都会用到邓白氏编码,也就是我们申请苹果开发者账号时需要填写的D-U-N-S Number。     申请这个邓白氏编码是免费的,但是从像华夏邓白氏公司提交申请到可以申请苹果开发者账号来用这个9位的D-U-N-S Number,需要一段时间,我申请得到D-U-N-S Number,用了8个工作日(不算周末哦)

wxw2011014003的博客 9万+

派对灯 Party Lamps [USACO 2.2]

有的时候,思路远比代码更重要!!!

2401_86416571的博客 1166

Win10+pycharm+conda 配置Siammask 过程记录(新手向)

我们跑动demo 需要配置两个相关的文件这两个文件需要用 git 进行下载,对于不熟悉git的小伙伴 我这里给出连接,大家可以直接下载即可,并将其配置在 experiments文件夹下然后大家再需要在设置参数参数这里给出了。

C1137577723的博客 551

USACO 2.2.4 派对灯 Party Lamps

题解 这题还是比较有意思的,难在理解题意。 naive的遍历所有情况 O(4^N) 是绝对不行滴。 仔细想想,按一个按键 偶数次等于不按,按奇数次相当于按一次。所以某按钮按几次可以统统转化为按了0或1次。 再想想,按的次序有没有影响。答案是没有,模拟一下可知。 那么其实,所谓的 4^N 种 变化其实 就只有 0000~1111 这 16种而已。那么我们把这16种情况全部求出再作比较即可。...

蟋蟀的博客 382

网格自适应实战 | 攻克超弹性体大变形不收敛难题

本文针对超弹性体(如橡胶)在大变形仿真中因网格严重扭曲导致计算不收敛的难题,提供了基于ANSYS网格自适应技术的实战解决方案。文章详细阐述了从问题诊断、模型准备到核心参数设置的完整流程,并介绍了结合混合U-P单元技术的进阶组合策略,有效攻克了材料压缩等场景下的仿真收敛问题。

week9的博客 519

STK中的传感器与通信组件:雷达、发射机、接收机与天线的协同建模

本文深入解析了STK软件中传感器、雷达、发射机、接收机与天线的协同建模方法。通过构建一个完整的卫星对地数传系统实例,阐述了各组件如何分工协作,实现从几何指向到射频链路的高保真仿真,为复杂航天通信与探测系统的设计与分析提供了高效、灵活的解决方案。

weixin_29271263的博客 273

[USACO2.2]派对灯 Party Lamps 题解

洛谷原题链接:[USACO2.2]派对灯 Party Lamps - 洛谷 太细了太细了太细了!!!首先得想到多转4,然后是4转2,这是基本思路。代码实现更恶心好吧!首先得想到b[9][7]的各种情况,要想到6是循环节,然后进入主程序,第一个点就是当c==0但是还有关灯限制的是IMPOSSIBLE(其实可以有开灯限制,但是数据比较水,开灯限制没管也能过)第二个点是c=0但是没有关灯限制,此时输出全是1。接着进入主要循环,c==1的话根本不会有5,6,7三种情况,得特判去掉,最后就是还得判断虽然前面这几个点

HypnotizeG的博客 474

Qt C++ 实现一个完整的扫雷

mineCountLabel = new QLabel(QString("地雷: %1").arg(remainingMines, 3, 10, QChar('0')), this);mineCountLabel->setText(QString("地雷: %1").arg(remainingMines, 3, 10, QChar('0')));timeLabel->setText(QString("时间: %1").arg(gameTime, 3, 10, QChar('0')));" : "游戏失败!

寒寒豆豆软件公司的博客 107

USACO 2.2 Party Lamps

这道题的闲话时间我一定要放在开头…… 觉得自己这道题实在写得太丑了,但是最近事情多,刷过了懒得改,于是我决定随便说一说自己的思路和官方的思路,然后再把自己丑得要命的代码贴一下……

云雀的工作本 568

自私兽群优化器(SHO)详解:从生物本能到智能优化

自私兽群优化器(SHO)是一种受动物群体自私行为启发的智能优化算法。该算法模拟动物在捕食威胁下的两种行为:聚集行为(全局搜索)和自私行为(局部搜索),将优化问题的解空间映射为生存环境,候选解视为猎物个体。SHO通过安全性评估将猎物分为安全、危险和高危三类,分别采用不同的位置更新策略,并引入捕食者角色增加选择压力。相比传统优化算法,SHO具有无需梯度信息、自适应平衡探索与开发、参数简单等优势,特别适合高维复杂和多模态优化问题。算法通过马尔可夫链理论保证收敛性,已在工程设计和数据挖掘等领域展现出良好性能。

qq_42212808的博客 197

知识图谱-构建:知识图谱构建流程【本体构建、知识抽取(实体抽取、 关系抽取、属性抽取)、知识表示、知识融合、知识存储】

旅游领域的类是用来描述旅游的抽象化概念术语,是对众多旅游个体共性的概念化描述。术语是划分类的基础,根据构建领域本体的目标和具体需要,可以确定哪些术语能作为领域本体的类。在以上抽取的众多旅游领域术语中,有些是能直接作为类的,如旅游、人物、交通方式、景区等等,而有些则不能作为类,如票价、景区门票、联系方式等等,它们只是属性。“旅游”很明显是最顶层的类,是父类。然后,要确定旅游的子类,根据大众标签里体现的共性和《中国分类主题词表》确定了旅游领域的11个核心概念,即本体层次结构图数据属性(固有属性)...

u013250861的博客 4万+

usaco2.2.4 Party Lamps

一 原题 Party Lamps IOI 98 To brighten up the gala dinner of the IOI'98 we have a set of N (10 N. The lamps are connected to four buttons: Button 1: When this button is pressed, all the lamps

max_kibble的博客 413

9 硬件工程师笔面试高频知识考点真题解析——运算放大器

运算放大器(运放)摘要 运放是一种高增益、差分输入的模拟集成电路,具有虚短(线性区输入电压相等)和虚断(输入电流为零)特性,支持负反馈(线性放大)和开环/正反馈(饱和区比较)两种工作模式。关键特性包括高输入阻抗、低输出阻抗,理想运放参数(如无限增益)与实际参数(如有限带宽)的差异。 选型要点: 信号特性:直流/低频信号关注失调电压(Vos)、温漂;高频信号侧重带宽(GBW)和压摆率(SR)。 电源条件:单/双电源供电、电压范围及功耗需求(如电池设备需低静态电流)。 精度与噪声:微弱信号需低噪声运放,高精度场

XU157303764的博客 1675

USACO Section 2.2 Party Lamps

/* ID: lucien23 PROG: lamps LANG: C++ */ /* * 此题的技巧之处就是需要注意到任何button只要按下2的倍数次就相当于没有按 * 所以其实只需要考虑4个按钮,每个按钮是否被有效按下过一次就好 * 直接使用枚举法,一共只有2^4=16种情况 * 对于每种情况需要知道被按下的有效次数(也就是被按下过的按钮数),必须满足 * (C-有效次数)%2=0

程序缘 1222

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

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

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

USACO 2.2 Party Lamps 派对灯 (lamps)

题目描述 在IOI98的节日宴会上,我们有N(10<=N<=100)盏彩色灯,他们分别从1到N被标上号码。这些灯都连接到四个按钮: 按钮1:当按下此按钮,将改变所有的灯:本来亮着的灯就熄灭,本来是关着的灯被点亮。 ...

angsai7330的博客 309

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

[USACO 2.2.4] Party Lamps

[题目描述] Party Lamps 派对灯 IOI98 在IOI98的节日宴会上,我们有N(10 这些灯都连接到四个按钮: 按钮1:当按下此按钮,将改变所有的灯:本来亮着的灯就熄灭,本来是关着的灯被点亮。按钮2:当按下此按钮,将改变所有奇数号的灯。按钮3:当按下此按钮,将改变所有偶数号的灯。按钮4:当按下此按钮,将改变所有序号是3*K+1(K>=0)的灯。例如:1,4,7..

_Nirvana 889

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

USACO:2.2.4 Party Lamps 派对灯

USACO:2.2.3  Party Lamps 派对灯 题目描述 ★Party Lamps 派对灯 在IOI98 的节日宴会上,我们有N(10 这些灯都连接到四个按钮: 按钮1:当按下此按钮,将改变所有的灯:本来亮着的灯就熄灭,本来是关着的灯被点亮. 按钮2:当按下此按钮,将改变所有奇数号的灯. 按钮3:当按下此按钮,将改变所有偶数号的灯. 按钮4:当按下此按钮,

蓝e的专栏 2982

[USACO2.2]派对灯 Party Lamps

。。。

Ajwallet 510

USACO Training Section 2.2 Party Lamps

[url="http://ace.delos.com/usacoprob2?a=3nbwNTZTBNm&S=lamps"]英文原题[/url] [url="http://www.wzoi.org/usaco/13%5C104.asp"]中文题译[/url] 题目大意: 一组灯,几个按钮,按一个按钮可以改变若干灯的开关状态。给定按按钮的计数次数和最终状态中若干个灯的状态,要求求出所有可能状...

山中竹笋 176

USACO 2.2.4 Party Lamps

Translation 在IOI98的节日宴会上,我们有N(10 按钮1:当按下此按钮,将改变所有的灯:本来亮着的灯就熄灭,本来是关着的灯被点亮。 按钮2:当按下此按钮,将改变所有奇数号的灯。 按钮3:当按下此按钮,将改变所有偶数号的灯。 按钮4:当按下此按钮,将改变所有序号是3*K+1(K>=0)的灯。例如:1,4,7... 一个计数器C记录按钮被按下的次数。当宴会开

Dream Catcher 451

USACO 2.2Party Lamps

meaning:是给4个开关,第一个开关控制所有灯,也就是本来开的变关,本来关的变开,第二个开关控制单数灯,第三个开关控制双数灯,第4个开关控制n%3==1的灯。 给一个n,c,分别表示灯的数量和按下开关的数量,然后再给按c次开关后有哪几个灯是亮的,哪几个灯是不亮的。如果存在满足的可能则输出所有可能,按照0在前面的输出顺序,也就是数组大小的输出顺序,如果不可能则输出IMPOSSIBLE. th

yeleng的博客 373

【USACO2.2.4】Party Lamps派对灯——杨子曰题目

【USACO2.2.4】Party Lamps派对灯——杨子曰题目 题目描述 在IOI98的节日宴会上,我们有N(10<=N<=100)盏彩色灯,他们分别从1到N被标上号码。 这些灯都连接到四个按钮: 按钮1:当按下此按钮,将改变所有的灯:本来亮着的灯就熄灭,本来是关着的灯被点亮。 按钮2:当按下此按钮,将改变所有奇数号的灯。 按钮3:当按下此按钮,将改变所有偶数号的灯。 按钮4:当按...

杨子曰:代码是神奇的 797

[2016/7/26][usaco 2.2]Party Lamps

这两天因为身体原因没有写题,简直罪过罪过。今天要抓紧时间敲敲敲了qwq http://train.usaco.org/usacoprob2?a=SzjbOuWGTGm&S=lamps 这是一道极其坑的题,调了昨天一下午+今天一早上。 思路倒没什么难的,每六位一个循环,按钮按两下等同于不按。所以最多有2^4种情况,dfs就行了。 关键是!输出要用字典序!! 简直神坑啊。。 又用的bi

ZZURingo的博客 509

USACO 2.2 Party Lamps (lamps)

//Main idea: //Reading the problem condition, we can know that //1: the order we press the button mean nothing for the final lamp state; //2: when the button is pressed even times, it mean nothing for

Hello World! 1033
上一篇: usaco2.2 runround
下一篇: usaco2.3 prefix trie树 + dp
kkkkahlua
博客等级 码龄12年 4粉丝 116原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值