5.1 qbxt 一测 T3
反物质
【问题描述】
物理学家有一种假设,世界上存在反物质,反物质遇到正常的物质会发生湮灭。
假设现在有 n 个粒子,每个粒子的种类用一个 m 以内的正整数表示。现在
要将这些粒子按一定顺序放入一个封闭空间。封闭空间最初什么都没有。
每当放进一个粒子时,若封闭空间为空或封闭空间中的粒子和放入的粒子
种类相同,这个粒子将留在封闭空间中;若封闭空间中的粒子和放入的粒子种
类不同,则封闭空间中会有一个粒子和放入的粒子抵消(即湮灭)。
判断是否存在一种排序方案,使得最后封闭空间中有种类编号为“1”的粒
子存在。若存在,最大化最后种类编号为“1”的粒子个数。若多种方案,要求
字典序最小。
【输入格式】
第 1 行:n 和 m,用空格隔开。
第 2 到 m+1 行:第 i+1 行代表第 i 种粒子有多少个。每种粒子至少有 1 个。
保证粒子总数是 n。
【输出格式】
第 1 行:如果最后封闭空间中可以有编号为“1”的粒子存在,输出 YES,否则输出 NO。
如果第一行输出了 YES,还需继续输出:
第 2 行:这一行输出最后“1”的个数。
第 3…n+2 行:输出在能最后“1”有最大数的排序方案里,字典序最小的方案。
如果第一行输出了 NO,就不必输出其他内容了
【样例输入】
5 3
2
1
2
【样例输出】
YES
1
1
3
2
3
1
【数据规模和约定】
对于 30%的数据, n<=10
对于 60%的数据, n<=1000
对于 100%的数据, 1<=m<=n<=10^6
考场解题:
哎呦呦呦,这题只输出最多剩下多少还好,这按字典序排列可就
难为死人啦,这咋排,管他呢,先判断下‘NO’的情况吧,说不定还
能的点分,如果某种粒子的个数超过了总个数的一半,那么一定不能
有‘1’粒子,与之共存,则输出‘NO’ ,此时还需要注意者最多的是
不是 ‘1’ 粒子, 也就到这思路靠谱点, 后边的瞎想就不在此多说了,
总之就是看啥顺眼打打试试吧。
预计得分:10-20(还不得有个‘NO’送点分)
实际得分:0(没爱了)
正解:
代码理解吧:
#include<cstdio>
#include<algorithm>
using namespace std;
const int N = ;
int n,m;
int num[N];
int big=;
int cc[N],xu[N];
int last[N];
bool cmp(int x, int y)
{
return(num[x]<num[y]);
}
void print()
{
int i,sum=;
for(i=; i<=m; i++)
xu[i]=i;
sort(xu+,xu+m+,cmp);
/* for(i=1;i<=m;i++)
cc[num[i]]++;
//cc[x]表示粒子数量为x的有几种
for(i=1;i<=n;i++)
cc[i]+=cc[i-1];
//cc[x]表示粒子数量不超过x的有几种
for(i=1;i<=m;i++)
xu[cc[num[i]]--]=i;
//把各种粒子按照num[i]从小到大排序
*/
for(i=; i<=m; i++)
{
last[i]=num[i];//last剩下多少个i这种粒子
sum+=last[i];//还有多少该抵消的粒子没抵消
}
int top=m; //xu中下标超过top的,num都大于sum/2
int tot=; //现在封闭空间中有多少个粒子,粒子编号小于s
int s=; //现在还剩下的粒子中编号最小的
while()
{
while(s<=m && !last[s])
s++;
if(s>m)
break;
if(!tot)
{
tot=last[s];
last[s]=;
for(i=; i<=tot; i++)
printf("%d\n",s);
}
else
{
sum-=;
tot--;
while(top && num[xu[top]]>sum/)
top--;
for(i=m; i>top; i--)
{
if(last[xu[i]]>sum/)
break;
}
if(i>top)
{
printf("%d\n",xu[i]);
last[xu[i]]--;
}
else
{
printf("%d\n",s);
last[s]--;
}
}
}
}
int main()
{
freopen("anti.in","r",stdin);
freopen("anti.out","w",stdout);
int i;
scanf("%d%d%d",&n,&m,&num[]);
for(i=; i<=m; i++)
{
scanf("%d",&num[i]);
if(num[i]*>n-num[])
big=i; // 找出最大种类的数目
}
if(big)
{
int remain=num[big]-(n-num[]-num[big]);
if(num[]>remain)
{
if(m>) //如果两类,先输出1 2 结果都一样,字典序最小先输出 1
{
int t=num[]-remain;
num[]=remain;
printf("YES\n%d\n",t);
print();
for(i=; i<=t; i++)
printf("1\n");
}
else
{
int t=num[]-remain; //t表示要先输出多少个 1
printf("YES\n%d\n",t);
for(i=; i<=num[]; i++)
printf("1\n");
for(i=; i<=num[]; i++)
printf("2\n"); //最后输出几个 1
}
}
else
printf("NO\n"); //若big占比重大, 可以抵消全部的1,则输出‘NO’;
}
else
{
int t;
if((n-num[])%==)
{
if(num[]<=)
{
printf("NO\n");
return ;
}
t=num[]-;
num[]=;
}
else
{
if(num[]<)
{
printf("NO\n");
return ;
}
t=num[];
num[]=;
}
printf("YES\n%d\n",t);
print();
for(i=; i<=t; i++)
printf("1\n");
}
return ;
}
细节多,心累!
5.1 qbxt 一测 T3的更多相关文章
- 7.20试机测 T3 阶乘之和 暴力AC题解
7.20试机测 T3 阶乘之和 暴力AC题解 题外话:此乃本蒟蒻发表的第一篇题解,大家多多关照,支持一下,谢谢 题面 3.阶乘之和(sum.pas/in/out) 问题描述: 给定一个非负整数 n, ...
- NOI十连测 第六测 T3
思路:考试的时候我非常地**,写了圆并,然后还TM写了半平面交和三角剖分,虽然只有30分..但是看在我写了500行的份上还是挂着吧.. #include<cstdio> #include& ...
- NOI十连测 第四测 T3
思路: 算法一:可以n^2找出每个点的权值,然后n^2做完,预计得分10 算法二:随机找点然后每次找最高..貌似只有10分?然而考试的时候煞笔了,边界设成inf.. 算法三:随机找几个点,然后随机爬山 ...
- 5.1 qbxt 一测 T2
求和[问题描述] 组合数 C(n,m)是从 n 个物品中取 m 个的方案数. C(n,m)=(n!)/(m!(n-m)!) 斐波那契数列 F 满足,F[0]=F[1]=1,n≥2 时 F[n]=F[n ...
- 5.1 qbxt 一测 T1
禁咒检验 (3MB / 2s)[问题描述] 在古老的世界里,有一个神奇的职业叫做魔法师. 魔法师的特点是会魔法,施放魔法需要念咒语. 在古老的世界里,有一个神奇的职业叫做码农.码农的工作是帮助魔法师记 ...
- 暑假集训D11总结
%dalao 今天某学长来讲一个极其高深的数据结构——线段树(woc哪里高深了),然而并没有时间整理笔记= =,所以明天在扔笔记咯= = 考试 今天考试,一看数据范围,woc暴力分给的真足,然后高高兴 ...
- noip2018——题解&总结
近期正在疯狂复习某些东西,这篇博客尽量年底更完……(Day2T2除外) 好了,所有的希望都破灭了,原来这就是出题人的素质.——一个被欺骗的可怜 $OIer$ 人生中倒数第三次 $noip$ (Mayb ...
- CSP-S2021 退役记
首先大家一起恭喜博主以5pts之差与省三擦肩而过!(nmd爷去年都省三今年成功打铁了) 果然这个菜鸡一年不如一年了 upd:T3死在多测上了,随便一个40+28的人可以吊打我 Day -2: 模拟赛, ...
- 弱省互测#2 t3
题意 给出\(n\)个01字节和\(m\)个01字节,要求用后者去匹配前者,两个串能匹配当且仅当除了每个字节末位不同,其他位都要相同.问匹配后者至少有多少个末位不同.(\(1 \le m \le n ...
随机推荐
- E20170414-ms
collapse v/n 奔溃,垮台 constraint n 约束,限制 adaptive adj 适应的; 有适应能力的; exhausitive adj. 详尽的; store n 商店,仓 ...
- FrameLayout 的使用方法
一.FrameLayout介绍 FrameLayout帧布局是最简单的布局之一,采用帧布局的容器中无论放入多少个控件,控件默认情况下左上角都对齐到容器的左上角,如果控件一样大,同一时间只能见到最上面的 ...
- poj 2891 Strange Way to Express Integers【扩展中国剩余定理】
扩展中国剩余定理板子 #include<iostream> #include<cstdio> using namespace std; const int N=100005; ...
- iperf工具学习记录
源码下载地址:http://sourceforge.net/projects/iperf/ 编译命令: tar -zxvf iperf-2.0.5.tar.gz cd iperf-2.0.5 ./co ...
- elasticsearch接口开发(新)
此文在上一篇文章的基础上稍做了些许修改,主要在springboot整合ES后的包路径上,如下是新的目录结构 下面贴出代码 MyConfig.java package com.ylht.config; ...
- PHP + jquery.validate remote的用法
[ 转 ] http://www.cnlvzi.com/index.php/Index/article/id/58 最近做验证功能时,用到jquery.validate.js中的remote远程验证方 ...
- 跟我一起玩Win32开发(21):复制&粘贴&剪贴板操作
我要提醒一下大家,看了我的博文学到的知识,千万不要用于实际开发,不然你会被你的上司骂:“妈的,这些东西哪来的,从来没有人这样做过.”不信你试试,脑细胞被冻结的经理或者技术总监们肯定会这样说的. 如果是 ...
- Python递归和迭代
递归 在函数内部,调用函数自身的编程技巧称为递归( recursion).递归函数结构清晰,很直观的理解计算过程,但也有严重缺点:相对于普通循环而言,递归运行效率较低,经过很多冗余的计算,递归会消耗大 ...
- Linux修改文件的权限,拥有者,所属组
修改文件的权限,拥有者,所属组 1.设置文件的权限(chmod) ①方式一(建议使用这种方式) 命名:chomd 755 文件名 ②方式二 命名:chomd -R +x 文件名 2.设置文件的拥有者( ...
- 转 做了两款数据库监控工具(mysql and nosql),打算在近期开源
http://www.cnblogs.com/leefreeman/p/7297549.html 监控指标:https://www.linuxidc.com/Linux/2015-08/122009. ...