反物质
【问题描述】
  物理学家有一种假设,世界上存在反物质,反物质遇到正常的物质会发生湮灭。

  假设现在有 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的更多相关文章

  1. 7.20试机测 T3 阶乘之和 暴力AC题解

    7.20试机测  T3 阶乘之和 暴力AC题解 题外话:此乃本蒟蒻发表的第一篇题解,大家多多关照,支持一下,谢谢 题面 3.阶乘之和(sum.pas/in/out) 问题描述: 给定一个非负整数 n, ...

  2. NOI十连测 第六测 T3

    思路:考试的时候我非常地**,写了圆并,然后还TM写了半平面交和三角剖分,虽然只有30分..但是看在我写了500行的份上还是挂着吧.. #include<cstdio> #include& ...

  3. NOI十连测 第四测 T3

    思路: 算法一:可以n^2找出每个点的权值,然后n^2做完,预计得分10 算法二:随机找点然后每次找最高..貌似只有10分?然而考试的时候煞笔了,边界设成inf.. 算法三:随机找几个点,然后随机爬山 ...

  4. 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. 5.1 qbxt 一测 T1

    禁咒检验 (3MB / 2s)[问题描述] 在古老的世界里,有一个神奇的职业叫做魔法师. 魔法师的特点是会魔法,施放魔法需要念咒语. 在古老的世界里,有一个神奇的职业叫做码农.码农的工作是帮助魔法师记 ...

  6. 暑假集训D11总结

    %dalao 今天某学长来讲一个极其高深的数据结构——线段树(woc哪里高深了),然而并没有时间整理笔记= =,所以明天在扔笔记咯= = 考试 今天考试,一看数据范围,woc暴力分给的真足,然后高高兴 ...

  7. noip2018——题解&总结

    近期正在疯狂复习某些东西,这篇博客尽量年底更完……(Day2T2除外) 好了,所有的希望都破灭了,原来这就是出题人的素质.——一个被欺骗的可怜 $OIer$ 人生中倒数第三次 $noip$ (Mayb ...

  8. CSP-S2021 退役记

    首先大家一起恭喜博主以5pts之差与省三擦肩而过!(nmd爷去年都省三今年成功打铁了) 果然这个菜鸡一年不如一年了 upd:T3死在多测上了,随便一个40+28的人可以吊打我 Day -2: 模拟赛, ...

  9. 弱省互测#2 t3

    题意 给出\(n\)个01字节和\(m\)个01字节,要求用后者去匹配前者,两个串能匹配当且仅当除了每个字节末位不同,其他位都要相同.问匹配后者至少有多少个末位不同.(\(1 \le m \le n ...

随机推荐

  1. E20170403-gg

    thumbnail 缩略图 inherit     vt. 继承; vt. 经遗传获得(品质.身体特征等),继任; opacity 不透明度   flat     adj. 平的; 单调的; 不景气的 ...

  2. 洛谷 - P1379 - 八数码难题 - bfs

    https://www.luogu.org/problemnew/show/P1379 #include <bits/stdc++.h> using namespace std; #def ...

  3. 几题LCS后的小总结

    先得理解最长上升子序列吧,这还是非常简单的. 然后就是要真正理解LCS: 真正理解源于做题,做题就像查漏补缺一样,你总有不会的地方. 非常彻底地理解该图(还是去做题啦) = =瞎几把乱说有两种问题 [ ...

  4. layui前端框架实例(修复官网数据接口异常问题)

    layui前端框架实例,官网的实例会提示数据接口异常,已修复. 主要是修改数据表格,做一个可以用的实例,可以选中,编辑,删除等. gitee地址:https://gitee.com/pingg2019 ...

  5. EOS:dfuse stream 保证不会错过一个心跳

    强大的 dfuse history API 给我们带来了高效的链数据获取途径,让我们的 dapp 在用户体验上了一个台阶. 官方示例 不会错过一个心跳 代码分析 函数 pendingActions 待 ...

  6. TensorFlow多线程输入数据处理框架(三)——组合训练数据

    参考书 <TensorFlow:实战Google深度学习框架>(第2版) 通过TensorFlow提供的tf.train.batch和tf.train.shuffle_batch函数来将单 ...

  7. Ubuntu 18.04 LTS 安装后 各种问题以及解决方案

    1. root的初始密码,默认是不知道的,需要进行设置 a. 进入终端自己的用户 b. 输入 sudo passwd回车 c. 输入新密码,回车,重复,回车,搞定 d. su 一下,就可以了 2.  ...

  8. Helvetic Coding Contest 2017 online mirror (teams allowed, unrated) A

    Description Your search for Heidi is over – you finally found her at a library, dressed up as a huma ...

  9. linux高负载下mysql数据库彻底优化

    同时在线访问量继续增大 对于1G内存的服务器明显感觉到吃力严重时甚至每天都会死机 或者时不时的服务器卡一下 这个问题曾经困扰了我半个多月MySQL使用是很具伸缩性的算法,因此你通常能用很少的内存运行或 ...

  10. ubuntu安装mysql多实例

    想要尝试mysql的读写分离,在云上安装完mysql之后突然想到一个问题:我本机是没有公网IP的. 开始尝试在唯一一台云服务器上安装多个mysql实例. 主要步骤: 1.新建MySQL目录 (1):新 ...