[NOIP2016普及组]魔法阵

题目:洛谷P2119、Vijos P2012、codevs5624。

题目大意:有n件物品,每件物品有个魔法值。要求组成魔法阵(Xa,Xb,Xc,Xd),该魔法阵要满足Xa<Xb<Xc<Xd,Xb-Xa=2(Xd-Xc),并且Xb-Xa<(Xc-Xb)/3。求每件物品作为a、b、c、d的次数。

解题思路:这真是一道锻炼思(bào)维(lì)能力的好(kēng)题!

首先枚举魔法阵的每件物品,姿势好可得65(洛谷测)。

然后是强(wěi)大(suǒ)的正解。

首先利用桶排的思路保存各个魔法值。

设Xd-Xc=t,则根据一系列推论可得:

Xb-Xa=2t

Xc-Xd>6t

那么首先想到的就是枚举t,然后再枚举c、b,算出a、d,最后一交发现还是超时几个点!!是不是气的想砸电脑了?

别急慢慢来。首先我们可以发现,t的枚举范围在1~n/9中即可。

然后我们令d取满足条件的最小值(9t+2),a就只能取1(b可以根据a推出,不用考虑),那么如果d增加1,a就能选1、2,d增加2,a能取1、2、3……

那么我们用一个sum记录当前a、b共有多少种选法,然后计算c、d,就不用再次枚举了。

同理a、b取最大值,然后如此计算即可。

满分拿到,感觉比网络流还难!!!

C++ Code:

#include<cstdio>
#include<cctype>
using namespace std;
int n,m,cnt[15999]={0};
int A[15999]={0},B[15999]={0},C[15999]={0},D[15999]={0},f[40004];
inline int readint(){
	char c=getchar();
	int p=0;
	for(;!isdigit(c);c=getchar());
	for(;isdigit(c);c=getchar())p=(p<<3)+(p<<1)+(c^‘0‘);
	return p;
}
int main(){
	m=readint(),n=readint();
	for(int i=1;i<=n;++i){
		f[i]=readint();
		++cnt[f[i]];
	}
	for(int t=1;9*t<=m;++t){
		int sum=0;
		for(int d=t*9+2;d<=m;++d){
			int c=d-t,b=d-7*t-1,a=d-9*t-1;
			sum+=cnt[a]*cnt[b];
			C[c]+=cnt[d]*sum;
			D[d]+=cnt[c]*sum;
		}
		sum=0;
		for(int a=m-t*9-1;a>=1;--a){
			int b=a+2*t,c=a+8*t+1,d=a+9*t+1;
			sum+=cnt[c]*cnt[d];
			A[a]+=cnt[b]*sum;
			B[b]+=cnt[a]*sum;
		}
	}
	for(int i=1;i<=n;++i)printf("%d %d %d %d\n",A[f[i]],B[f[i]],C[f[i]],D[f[i]]);
	return 0;
}
时间: 2024-12-25 08:00:36

[NOIP2016普及组]魔法阵的相关文章

[题解]noip2016普及组题解和心得

[前言] 感觉稍微有些滑稽吧,毕竟每次练的题都是提高组难度的,结果最后的主要任务是普及组抱一个一等奖回来.至于我的分数嘛..还是在你看完题解后写在[后记]里面.废话不多说,开始题解. 第一题可以说的内容不是很多吧.直接暴力,计算每种铅笔需要花费的金额. 只不过计算的时候,需要注意如下问题 如果不是整数倍,除完后要加1 神奇的Linux系统,很多人的第三个点wa了,所以要养成良好的编写代码的习惯 Code(我的源程序) 1 #include<iostream> 2 #include<fst

NOIP2016普及组复赛解题报告

提高组萌新,DAY1DAY2加起来骗分不到300,写写普及组的题目聊以自慰. (附:洛谷题目链接 T1:https://www.luogu.org/problem/show?pid=1909 T2:https://www.luogu.org/problem/show?pid=2010 T3:https://www.luogu.org/problem/show?pid=2058 T4:https://www.luogu.org/problem/show?pid=2119) 不得不说,亲历了14.1

NOIP2016普及组

嗯,今年的普及组难度-- 题目链接:http://qscoj.cn/problem/55/ 买铅笔 时间限制: 1000ms   内存限制: 128M 描述 P老师需要去商店买n支铅笔作为小朋友们参加NOIP的礼物.她发现商店一共有 3种包装的铅笔,不同包装内的铅笔数量有可能不同,价格也有可能不同.为了公平起 见,P老师决定只买同一种包装的铅笔. 商店不允许将铅笔的包装拆开,因此P老师可能需要购买超过n支铅笔才够给小朋 友们发礼物. 现在P老师想知道,在商店每种包装的数量都足够的情况下,要买够至

【NOIP2016普及组复赛】魔法阵

题目 分析 设xd-xc为i,那么xb-xa=2i, 又因为xb-xa<(xc-xb)/3, 那么c>6i+b. 于是,先枚举i, 再分别枚举xa和xd, 根据之间的关系,用前缀和求出每一种魔法阵的每一种物品的次数. #include <cmath> #include <iostream> #include <cstdio> #include <cstdlib> #include <cstring> #include <algo

noip2016 普及组

T1 买铅笔 题目传送门 #include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int inf=0x3f3f3f3f; int read(){ int ans=0,f=1,c=getchar(); while(c<'0'||c>'9'){if(c=='-') f=-1; c=getchar();} while(c>='0'&&c

洛谷P2119 魔法阵

题目描述 六十年一次的魔法战争就要开始了,大魔法师准备从附近的魔法场中汲取魔法能量. 大魔法师有m个魔法物品,编号分别为1,2,...,m.每个物品具有一个魔法值,我们用Xi表示编号为i的物品的魔法值.每个魔法值Xi是不超过n的正整数,可能有多个物品的魔法值相同. 大魔法师认为,当且仅当四个编号为a,b,c,d的魔法物品满足xa<xb<xc<xd,Xb-Xa=2(Xd-Xc),并且xb-xa<(xc-xb)/3时,这四个魔法物品形成了一个魔法阵,他称这四个魔法物品分别为这个魔法阵的

2017年8月14日套题记录 | 普及组

写在前面 今天登洛谷发现离Noip剩下88天了??(虽然看起有点久),然后觉得似乎水了一个暑假什么也没做(虽然学了点数据结构和一些奇奇Gaygay的东西),于是打开题库发现去年Long Happy的集训套题我似乎没有提交过,那就一天一套题,顺便码个题解+心得(雾? T2.传作业 题目描述 某十三同学一日上学迟到,此时已经开始上早自习了,所以他只好请同学帮忙把作业传到组长那里.由于刚开学不久,某十三同学还没来得及认识所有同学,所以传作业时只好找熟悉的同学.已知某十三与组长之间有N个他熟悉的同学,并

1143 纪念品分组 2007年NOIP全国联赛普及组

1143 纪念品分组 2007年NOIP全国联赛普及组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 白银 Silver 题解 查看运行结果 题目描述 Description 元旦快到了,校学生会让乐乐负责新年晚会的纪念品发放工作.为使得参加晚会的同学所获得的纪念品价值相对均衡,他要把购来的纪念品根据价格进行分组,但每组最多只能包括两件纪念品,并且每组纪念品的价格之和不能超过一个给定的整数.为了保证在尽量短的时间内发完所有纪念品,乐乐希望分组的数目最少. 你的任务是写一个程序

采药 2005年NOIP全国联赛普及组&amp;疯狂的采药

时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 辰辰是个天资聪颖的孩子,他的梦想是成为世界上最伟大的医师.为此,他想拜附近最有威望的医师为师.医师为了判断他的资质,给他出了一个难题.医师把他带到一个到处都是草药的山洞里对他说:"孩子,这个山洞里有一些不同的草药,采每一株都需要一些时间,每一株也有它自身的价值.我会给你一段时间,在这段时间里,你可以采到一些草药.如果你是一个聪明的孩子,你应该可以让采到的草药的总价值最大."