test20181015 B君的第二题
题意


分析
考场85分
用multiset暴力,由于教练的机子飞快,有写priority_queue水过了的人。
#include<cstdlib>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<ctime>
#include<iostream>
#include<string>
#include<vector>
#include<list>
#include<deque>
#include<stack>
#include<queue>
#include<map>
#include<set>
#include<bitset>
#include<algorithm>
#include<complex>
#pragma GCC optimize ("O0")
using namespace std;
template<class T> inline T read(T&x)
{
T data=0;
int w=1;
char ch=getchar();
while(!isdigit(ch))
{
if(ch=='-')
w=-1;
ch=getchar();
}
while(isdigit(ch))
data=10*data+ch-'0',ch=getchar();
return x=data*w;
}
typedef long long ll;
const int INF=0x7fffffff;
const int MAXN=1e5+7;
int p[MAXN];
struct node
{
double pri;
int id,num;
node(double pri=0,int id=0,int num=0):pri(pri),id(id),num(num){}
bool operator<(const node&rhs)const
{
return pri > rhs.pri || (pri == rhs.pri && id < rhs.id);
}
};
multiset<node>H;
multiset<node>::iterator it;
int cnt[MAXN];
int main()
{
freopen("taiyuan.in","r",stdin);
freopen("taiyuan.out","w",stdout);
int n,m;
read(n);read(m);
for(int i=1;i<=n;++i)
{
read(p[i]);
H.insert(node(p[i],i,1));
}
node t;
for(int i=1;i<=m;++i)
{
it=H.begin();
t=*it;
H.erase(it);
++cnt[t.id];
t.pri=(double)p[t.id]/(++t.num);
H.insert(t);
}
for(int i=1;i<=n;++i)
{
printf("%d\n",cnt[i]);
}
// fclose(stdin);
// fclose(stdout);
return 0;
}
标解
对于满分来说,关键在于直接算。
那么如果不考虑精度问题,我们可以直接实数二分当选的票数,计算出有多少人当选,最后处理一下票数相同的情况。很遗憾这个方法的精度几乎一定会爆炸。
最终的解法大概是,对于票数最多的党,整数二分这个党当选了多少人。
用这个人数最多的党,去推别的党当选了多少人。
这样推出来的结果,最多差1。
最后贪心下。
标程中的⽅法是直接虚拟一个党有10000 票,然后开始二分。
#include<cstdlib>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<ctime>
#include<iostream>
#include<string>
#include<vector>
#include<list>
#include<deque>
#include<stack>
#include<queue>
#include<map>
#include<set>
#include<bitset>
#include<algorithm>
#include<complex>
#pragma GCC optimize ("O0")
using namespace std;
template<class T> inline T read(T&x)
{
T data=0;
int w=1;
char ch=getchar();
while(!isdigit(ch))
{
if(ch=='-')
w=-1;
ch=getchar();
}
while(isdigit(ch))
data=10*data+ch-'0',ch=getchar();
return x=data*w;
}
typedef long long ll;
const int INF=0x7fffffff;
const int MAXN=1e5+7;
int n,m;
int p[MAXN];
int z[MAXN];
const int Q=1e4;
ll calc(ll t)
{
ll res=0;
for(int i=0;i<n;++i)
{
res+=p[i]*t/Q;
res=min(res,(ll)1e18);
}
return res;
}
struct node
{
int x,y;
int id;
node()=default;
node(int x,int y,int id):x(x),y(y),id(id){}
bool operator<(const node&rhs)const
{
if((ll)x*rhs.y!=(ll)y*rhs.x)
{
return (ll)x*rhs.y>(ll)y*rhs.x;
}
return id<rhs.id;
}
};
int main()
{
freopen("taiyuan.in","r",stdin);
freopen("taiyuan.out","w",stdout);
read(n);read(m);
for(int i=0;i<n;++i)
{
read(p[i]);
}
ll L=0,R=1e13;
while(L<R-1)
{
ll M=(L+R)/2;
if(calc(M)<=m)
L=M;
else
R=M;
}
int t=m-calc(L);
vector<node>V;
for(int i=0;i<n;++i)
{
z[i]=p[i]*L/Q;
if(p[i]*L/Q!=p[i]*R/Q)
{
V.push_back(node(p[i],z[i]+1,i));
}
}
sort(V.begin(),V.end());
for(int i=0;i<t;++i)
{
++z[V[i].id];
}
for(int i=0;i<n;++i)
{
printf("%d\n",z[i]);
}
// fclose(stdin);
// fclose(stdout);
return 0;
}
解释一下,由于实数二分的精度问题,我们假设二分的实数为\(\frac{Q}{t}\),那么当选人数为:
= \sum_{i} p_i * t / Q
\]
然后改为二分这个\(t\)。
test20181015 B君的第二题的更多相关文章
- test20181020 B君的第二题
题意 分析 考场70分 一看就是裸的kmp,直接打上去. #include<cstdlib> #include<cstdio> #include<cmath> #i ...
- B 君的第二题 (hongkong)
B 君的第二题 (hongkong) 题目大意: 一个长度为\(n(n\le2\times10^5)\)的数组,给定一个数\(k(k\le40)\).用\(a[i][j]\)表示该数组\(i\)次前缀 ...
- test20181016 B君的第二题
题意 分析 考场暴力50分. 考虑bfs序,一个点的儿子节点的bfs序一定连续,所以对bfs序建线段树,努力打一下就行了. 时间复杂度\(O(n \log n + m \log n)\) #inclu ...
- test20181017 B君的第二题
题意 分析 考场50分 旁边的L君告诉我,求的就是非升子序列的个数,于是写了个树状数组. 但是\(\mod{2333} > 0\)还需要组合数中没有2333的倍数,所以实际上只得了\(a_i \ ...
- test20181019 B君的第二题
题意 分析 快速子集和变换以及快速超集和变换的裸题. 用\(f(s)\)表示集合s的方案数,初始化为输入中s出现的次数. 做一遍快速子集和变换,此时f(s)表示s及其子集在输入中出现的次数. 对所有f ...
- Java蓝桥杯02——第二题集锦:生日蜡烛、星期一、方格计数、猴子分香蕉
第二题 生日蜡烛(结果填空) 某君从某年开始每年都举办一次生日party,并且每次都要吹熄与年龄相同根数的蜡烛. 现在算起来,他一共吹熄了236根蜡烛. 请问,他从多少岁开始过生日party的? 请填 ...
- 05:统计单词数【NOIP2011复赛普及组第二题】
05:统计单词数 总时间限制: 1000ms 内存限制: 65536kB 描述 一般的文本编辑器都有查找单词的功能,该功能可以快速定位特定单词在文章中的位置,有的还能统计出特定单词在文章中出现的次 ...
- 常见面试第二题之什么是Context
今天的面试题,也就是我们常见面试题系列的第二题,我们来讲一讲android中的context.我相信大家android开发者一定对于这个context非常熟悉,肯定都有使用过,肯定没有没使用过的.但是 ...
- 《学习OpenCV》练习题第五章第二题abc
代码: #include <stdio.h> #include <opencv/highgui.h> #include <opencv/cv.h> #include ...
随机推荐
- 生物信息Python-从入门到精通?
Python开发的方向太多了,有机器学习,数据挖掘,网络开发,爬虫等等.其实在生信领域,Python还显现不出绝对的优势,生信的大部分软件流程都是用shell或Perl写的,而且已经足够好用了.我选P ...
- Android之设计模式
设计模式的概念 1.基本定义:设计模式(Design pattern)是一套被反复使用的代码设计经验的总结.使用设计模式的目的是为了可重用代码.让代码更容易被他人理解.设计模式是是软件工程的基石脉络, ...
- android--------ListView和ExpandableListView的侧滑删除操作
本案例主要实现了ListView和ExpandableListView的侧滑删除操作功能 效果图: ListView的Adapter类 private class SlideAdapter exten ...
- zzuli 1726 迷宫 BFS(题意)
1726: 迷宫 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 502 Solved: 80 SubmitStatusWeb Board Descri ...
- spring创建单例bean
(使用的spring版本是3.2.10) 在xml文件中配置一个普通的bean,默认使用单例,创建该bean的调用栈如下: ClassPathXmlApplicationContext //Class ...
- spark 资源参数调优
资源参数调优 了解完了Spark作业运行的基本原理之后,对资源相关的参数就容易理解了.所谓的Spark资源参数调优,其实主要就是对Spark运行过程中各个使用资源的地方,通过调节各种参数,来优化资源使 ...
- 简话Angular 02 Angular控制器-作用域嵌套
一句话: 就是孩子可以啃老,老子不能动孩子一根毛! * 子控制器有父控制器里变量的所有权限,可以读取,也可以修改. * 父控制器不能读,也不能修改孩子的变量 1. html代码 <div ng- ...
- gitlab永久设置密码
在 .gitconfig 文件中加入: [credential] helper = store .git-credentials close address
- 关于Arch Linux efibootmgr 命令行参数问题
相关链接: https://wiki.archlinux.org/index.php/EFISTUB 今天安装Arch Linux 在 efibootmgr创建启动项时,总是提示 UUID=xxxx ...
- 形成一个zigzag数组(JPEG编码里取像素数据的排列顺序)
面试例题:输入n,求一个nXn矩阵,规定矩阵沿45度递增,形成一个zigzag数组(JPEG编码里取像素数据的排列顺序),请问如何用C++实现? (中国台湾著名硬件公司2007年11月面试题)(自程序 ...