题意



分析

考场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 / \frac{Q}{t}
= \sum_{i} p_i * t / Q
\]

然后改为二分这个\(t\)。

test20181015 B君的第二题的更多相关文章

  1. test20181020 B君的第二题

    题意 分析 考场70分 一看就是裸的kmp,直接打上去. #include<cstdlib> #include<cstdio> #include<cmath> #i ...

  2. B 君的第二题 (hongkong)

    B 君的第二题 (hongkong) 题目大意: 一个长度为\(n(n\le2\times10^5)\)的数组,给定一个数\(k(k\le40)\).用\(a[i][j]\)表示该数组\(i\)次前缀 ...

  3. test20181016 B君的第二题

    题意 分析 考场暴力50分. 考虑bfs序,一个点的儿子节点的bfs序一定连续,所以对bfs序建线段树,努力打一下就行了. 时间复杂度\(O(n \log n + m \log n)\) #inclu ...

  4. test20181017 B君的第二题

    题意 分析 考场50分 旁边的L君告诉我,求的就是非升子序列的个数,于是写了个树状数组. 但是\(\mod{2333} > 0\)还需要组合数中没有2333的倍数,所以实际上只得了\(a_i \ ...

  5. test20181019 B君的第二题

    题意 分析 快速子集和变换以及快速超集和变换的裸题. 用\(f(s)\)表示集合s的方案数,初始化为输入中s出现的次数. 做一遍快速子集和变换,此时f(s)表示s及其子集在输入中出现的次数. 对所有f ...

  6. Java蓝桥杯02——第二题集锦:生日蜡烛、星期一、方格计数、猴子分香蕉

    第二题 生日蜡烛(结果填空) 某君从某年开始每年都举办一次生日party,并且每次都要吹熄与年龄相同根数的蜡烛. 现在算起来,他一共吹熄了236根蜡烛. 请问,他从多少岁开始过生日party的? 请填 ...

  7. 05:统计单词数【NOIP2011复赛普及组第二题】

    05:统计单词数 总时间限制:  1000ms 内存限制:  65536kB 描述 一般的文本编辑器都有查找单词的功能,该功能可以快速定位特定单词在文章中的位置,有的还能统计出特定单词在文章中出现的次 ...

  8. 常见面试第二题之什么是Context

    今天的面试题,也就是我们常见面试题系列的第二题,我们来讲一讲android中的context.我相信大家android开发者一定对于这个context非常熟悉,肯定都有使用过,肯定没有没使用过的.但是 ...

  9. 《学习OpenCV》练习题第五章第二题abc

    代码: #include <stdio.h> #include <opencv/highgui.h> #include <opencv/cv.h> #include ...

随机推荐

  1. JVM自定义类加载器加载指定classPath下的所有class及jar

    一.JVM中的类加载器类型 从Java虚拟机的角度讲,只有两种不同的类加载器:启动类加载器和其他类加载器. 1.启动类加载器(Boostrap ClassLoader):这个是由c++实现的,主要负责 ...

  2. dp练习(5)——最长严格上升子序列

    1576 最长严格上升子序列  时间限制: 1 s  空间限制: 256000 KB  题目等级 : 黄金 Gold 题解       题目描述 Description 给一个数组a1, a2 ... ...

  3. 阿里云ECS安装最新版本Node.js

    原文  http://www.w3ctech.com/topic/1610 主题 Node.js操作系统服务器 我的ECS实例是Ubuntu操作系统,直接使用 apt-get install node ...

  4. vue2.0对不同数据类型的显示

  5. jstl <fmt:formatNumber>标签

    标签用于格式化数字,百分比和货币. 如果type属性为百分比或数字,则可以使用多个数字格式属性.maxIntegerDigits和minIntegerDigits属性允许您指定数字的非分数部分的大小. ...

  6. shiro中OAuth2 集成

    OAuth 角色 资源拥有者(resource owner): 能授权访问受保护资源的一个实体,可以是一个人,那我们称之为最终用户:如新浪微博用户 zhangsan: 资源服务器(resource s ...

  7. hdu4348

    题解: 因为卡空间,所以直接到spoj上面去做了 区间修改的线段树 但是加lazy会把之前的操作修改 正确的解法是lazy不下传,只是在当前计算 但是听说可以记录时间的下传,我弱弱不会 代码: #in ...

  8. js相关小技巧

    1.清空type=file的input文件上传控件的内容,相当于重置.txtFile是该input的id $("#txtFile").val(""); $(&q ...

  9. Double H6.0

    Double H 博客链接 成员 学号 姓名 211606379 王熙航(队长) 211606364 李冠锐 211606350 曾磊鑫 211606457 郑沐榕 211606342 杨艺勇 211 ...

  10. HTML5之pushstate、popstate操作history,无刷新改变当前url

    一.认识window.history window.history表示window对象的历史记录,是由用户主动产生,并且接受javascript脚本控制的全局对象.window对象通过history对 ...