关键词:
题目描述
在IOI98的节日宴会上,我们有N(10<=N<=100)盏彩色灯,他们分别从1到N被标上号码。 这些灯都连接到四个按钮:
按钮1:当按下此按钮,将改变所有的灯:本来亮着的灯就熄灭,本来是关着的灯被点亮。
按钮2:当按下此按钮,将改变所有奇数号的灯。
按钮3:当按下此按钮,将改变所有偶数号的灯。
按钮4:当按下此按钮,将改变所有序号是3*K+1(K>=0)的灯。例如:1,4,7...
一个计数器C记录按钮被按下的次数。当宴会开始,所有的灯都亮着,此时计数器C为0。
你将得到计数器C(0<=C<=10000)上的数值和经过若干操作后某些灯的状态。写一个程序去找出所有灯最后可能的与所给出信息相符的状态,并且没有重复。
输入输出格式
输入格式:
不会有灯会在输入中出现两次。
第一行: N。
第二行: C最后显示的数值。
第三行: 最后亮着的灯,用一个空格分开,以-1为结束。
第四行: 最后关着的灯,用一个空格分开,以-1为结束。
输出格式:
每一行是所有灯可能的最后状态(没有重复)。每一行有N个字符,第1个字符表示1号灯,最后一个字符表示N号灯。0表示关闭,1表示亮着。这些行必须从小到大排列(看作是二进制数)。
如果没有可能的状态,则输出一行‘IMPOSSIBLE‘。
输入输出样例
10 1 -1 7 -1
0000000000 0101010101 0110110110
说明
在这个样例中,有三种可能的状态:
所有灯都关着
1,4,7,10号灯关着,2,3,5,6,8,9亮着。
1,3,5,7,9号灯关着,2, 4, 6, 8, 10亮着。
翻译来自NOCOW
USACO 2.2
【分析】
又是一道很有意思的题,懒得打题解了就搬一个讲得最详细的来吧。
··· 以下是nocow思路:
每个按钮按2次和没按效果是一样的。所以每个按钮或者按或者不按,一共有2^4=16种状态。枚举每个按钮是否按下,然后生成结果,排序输出即可(注意判重)。
另外灯1和灯7,2和8,3和9...是一样的因此当N>=6时只需处理前6个,排序时转换为10进制数, 输出时反复输出前6个的状态.
深究:
这道题如果深究的话会变得非常简单, 但是提前声明,如果对这道题兴趣不大,或者是初学者,建议跳过, 刚才的分析已经足以过这道题。 我们现在记不按按钮,以及按下1,2,3,4按钮分别O,①,②,③,④, 那么,按下3,4,可以记为③④,以此类推, 我们发现一个问题,那就是①,②,③之间微妙的关系, ①②=③,而②③=①,①③=②(可以自己试试),于是我们知道,①②③也相当与不按,即相差3的倍数也可互相转换;
所以,所谓前四个的16种按法其实只有8种, 分别为:O,①,②,③,④,①④,②④,③④;
然后讨论c, 由于当c>4时,均可化为当c<=4的情况, 所以我们先讨论当c<=4的情况,
当c=0时,只有一种O;
当c=1时,四种:①,②,③,④;
当c=2时,除了④均可(可以自己想想);
当c=3时,由于3-1=2,所以c=1的情况都满足,而在c=2中,把所有有前三类的展开,如①④变为②③④, 可知满足c=2的同时满足c=3,所以c=3其实是c=2和c=1的并集,即所有按法均可。
当c=4时,由于4-1=3(①②③相当于不按),且4-2=2,由上,c=4也是所有按法均可。
当c>4时,我先有一个引理:对于任意的正整数n>1,均可写成n=2*p+3*q(p,q为非负整数)的形式, 证明如下:若n为偶数,必然成立,若n为奇数,必然大于2,则n-3必为非负偶数,得证。 由这个引理我们可以知道,任意c>4均可写成,c=2*p+3*q+3(p,q为非负整数)的形式,而可知, 对于两个相同的按键,以及情况①②③(按键三次),均相当于不按,所以任意c>4均可化归为c=3的情况, 即当c>4时,所有按法均可。
综上所述,
当c=0时,只有一种O;
当c=1时,四种:①,②,③,④;
当c=2时,除了④均可;
当c>2时,所有按法均可。
好了,这样一来就非常简单了, 只有四种情况,8种按法。
【代码】
1 #include <bits/stdc++.h> 2 using namespace std; 3 4 const int a[10][10]={{}, {0, 1, 1, 1, 1, 1, 1}, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 1, 1, 1, 0}, {0, 0, 1, 0, 1, 0, 1}, {0, 0, 1, 1, 0, 1, 1}, {0, 1, 0, 0, 1, 0, 0}, {0, 1, 0, 1, 0, 1, 0}, {0, 1, 1, 0, 0, 0, 1}}; 5 int n, c, op[10], cl[10], x; 6 bool flag; 7 8 void init() { 9 cin >> n >> c; 10 c=min(3, c); 11 memset(op, 0, sizeof(op)); 12 memset(cl, 1, sizeof(cl)); 13 while (scanf("%d", &x)==1) { 14 if (x==-1) 15 break; 16 op[x%6?x%6:6]=1; 17 } 18 while (scanf("%d", &x)==1) { 19 if (x==-1) 20 break; 21 cl[x%6?x%6:6]=0; 22 } 23 } 24 25 void check(int t) { 26 for (int i=1;i<=6;++i) 27 if ((op[i] && !a[t][i]) || (!cl[i] && a[t][i])) 28 return; 29 flag=true; 30 for (int i=1;i<=n;++i) 31 printf("%d", a[t][i%6?i%6:6]); 32 printf(" "); 33 } 34 35 void sovle() { 36 if (c==0) 37 check(1); 38 else if (c==1) 39 check(2), check(4), check(5), check(7); 40 else if (c==2) 41 check(2), check(3), check(4), check(6), check(7), check(8), check(1); 42 else 43 check(2), check(3), check(4), check(5), check(6), check(7), check(8), check(1); 44 if (!flag) 45 cout << "IMPOSSIBLE" << endl; 46 } 47 48 int main() { 49 init(); 50 sovle(); 51 }
洛谷p1466[usaco2.2]集合subsetsums
题目描述对于从1到N(1<=N<=39)的连续整数集合,能划分成两个子集合,且保证每个集合的数字和是相等的。举个例子,如果N=3,对于{1,2,3}能划分成两个子集合,每个子集合的所有数字和是相等的:{3}和{1,2}这是唯一一种分... 查看详情
洛谷p1467[usaco2.2]循环数runaroundnumbers
题目描述循环数是那些不包括0且没有重复数字的整数(比如81362)并且还应同时具有一个有趣的性质,就像这个例子:如果你从最左边的数字开始(在这个例子中是8)向右数最左边这个数(如果数到了最右边就回到最左边),你会停止在另... 查看详情
洛谷p1465[usaco2.2]序言页码prefacenumbering
题目描述一类书的序言是以罗马数字标页码的。传统罗马数字用单个字母表示特定的数值,以下是标准数字表:I1V5X10L50C100D500M1000最多3个同样的可以表示为10n的数字(I,X,C,M)可以连续放在一起,表示它们的和:III=3CCC=300可表示为5x10n... 查看详情
派对的最大快乐值
importjava.util.ArrayList;importjava.util.List;/***派对的最大快乐值*<p>*一棵多叉树代表员工的上下级关系,孩子节点是父节点的直接下级。*节点代表员工,属性包括快乐值和孩子节点列表。*大家参加了party,要求一个员工去了则它的... 查看详情
洛谷——p1821[usaco07feb]银牛派对silvercowparty
P1821[USACO07FEB]银牛派对SilverCowParty题目描述OnecowfromeachofNfarms(1≤N≤1000)convenientlynumbered1..Nisgoingtoattendthebigcowpartytobeheldatfarm#X(1≤X≤N).AtotalofM(1≤M≤100,000)unidirection 查看详情
洛谷p1821[usaco07feb]银牛派对silvercowparty
P1821[USACO07FEB]银牛派对SilverCowParty题目描述OnecowfromeachofNfarms(1≤N≤1000)convenientlynumbered1..Nisgoingtoattendthebigcowpartytobeheldatfarm#X(1≤X≤N).AtotalofM(1≤M≤100,000)unidirection 查看详情
luogup1468派对灯partylamps
题目描述在IOI98的节日宴会上,我们有N(10<=N<=100)盏彩色灯,他们分别从1到N被标上号码。这些灯都连接到四个按钮:按钮1:当按下此按钮,将改变所有的灯:本来亮着的灯就熄灭,本来是关着的灯被点亮。按钮2:当按下此... 查看详情
[洛谷201704r1]开心派对小火车
OJ题号:洛谷P3697思路:贪心。首先从起点出发,开特急电车,对于每一个特急车站$s_{i}$,分别下一次车,计算从当前车站$s_{i}$出发坐各停电车在指定时限内$t$最远能够到达的车站$r_{i}$,并保证这个$r_{i}$不会超过$s_{i+1}$。将得... 查看详情
派对选址
派对选址(party.pas/c/cpp)【题目描述】在2022年,scu_acmers决定举行一个聚会,并且大多数老scu_acmers队员已经收到了邀请函,包括队员onmylove,tanlinghang和zsasuke(scu_isap队的老队员)。从scu毕业已经10年了,现在他们住在不同的城市。他们... 查看详情
R:如何从派对包中旋转 ctreeobj 中的 x 轴标签
】R:如何从派对包中旋转ctreeobj中的x轴标签【英文标题】:R:HowdoIrotatex-axislabelsinactreeobjfromthepartypackage【发布时间】:2012-08-1509:03:11【问题描述】:我正在使用R中的party包来创建包含一些数据的决策树。我的因变量有一些长字符... 查看详情
洛谷p2962[usaco09nov]灯lights
P2962[USACO09NOV]灯Lights题目描述Bessieandthecowswereplayinggamesinthebarn,butthepowerwasresetandthelightswereallturnedoff.Helpthecowsgetallthelightsbackonsotheycanresumetheirgames.TheN(1<=N<=35)ligh 查看详情
party缩写是pa还是par
...TY信息到海词缩略语词典。Party英文简称:PTY中文全称:vi.开派对。n.[C]1.社交聚会Imetachildhoodfriendattheparty.在宴会上我遇见一个儿时的朋友。2.(共同工作或活动的)一团人,一伙人,一行人[G][(+of)]ApartyofretireddoctorsistouringwesternEurope.一群退... 查看详情
洛谷——p2040打开所有的灯
P2040打开所有的灯题目背景pmshz在玩一个益(ruo)智(zhi)的小游戏,目的是打开九盏灯所有的灯,这样的游戏难倒了pmshz。。。题目描述这个灯很奇(fan)怪(ren),点一下就会将这个灯和其周围四盏灯的开关状态全部改变。现在你的任务... 查看详情
洛谷p2040打开所有的灯
P2040打开所有的灯题目背景pmshz在玩一个益(ruo)智(zhi)的小游戏,目的是打开九盏灯所有的灯,这样的游戏难倒了pmshz。。。题目描述这个灯很奇(fan)怪(ren),点一下就会将这个灯和其周围四盏灯的开关状态全部改变。现在你的任务... 查看详情
开心派对小火车
题目:洛谷P3697题目大意是有各站停列车(慢车,相邻2站时间A)和特急列车(相邻2站时间B),特急列车在特定站点停靠。现在加一种快速列车(相邻2站时间C,A>C>B),停靠K站(包括所有特急列车停靠的站点),要求你设... 查看详情
ctree 在 R 中的派对包中绘制决策树,终端节点出现一些奇怪的数字 - 问题?
】ctree在R中的派对包中绘制决策树,终端节点出现一些奇怪的数字-问题?【英文标题】:ctreeplotdecisiontreeinpartypackageinR,terminalnodeoccurssomeweirdnumbers-issue?【发布时间】:2013-01-2417:41:28【问题描述】:我遇到了一些非常奇怪的东西..... 查看详情
编辑时的春季启动通知
...都在启动时检索此对象,其中一方为空。一位用户可以在派对列中为两位用户添加一些文本。但是,当这种情况发生时,我想更新两个用户的前端。如何让用户1知道该派对已更新?继续请求更改对象是不好的做法。【问题讨论... 查看详情
执行 INNER JOIN 时查询返回错误值?
...想加入三个表来计算某个(party_id)的余额=(purchase-payment):派对(party_id、类型、名称)采购(purchase_id、supplier_id、数量、费率、总计)付款(payment_id、pa 查看详情