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 ...
随机推荐
- 用MVVM模式开发中遇到的零散问题总结(1)
https://www.cnblogs.com/tong-tong/archive/2011/11/28/2250948.html
- JDK1.5 新特性
1:自动装箱与拆箱 自动装箱:每当需要一种类型的对象时,这种基本类型就自动地封装到与它相同类型的包装中. 自动拆箱:每当需要一个值时,被装箱对象中的值就被自动地提取出来,没必要再去调用intValue ...
- Confluence 6 使用 LDAP 授权连接一个内部目录概述
你可以为你的 Confluence 连接 LDAP 服务器使用使用委托认证.这个意思是 Confluence 将会设置一个内部目录,这个目录仅被用来处理 LDAP 的授权. 这个设置将会为尝试登录系统 ...
- Nginx配置https, 80端口重定向443
server { listen 443 ssl; server_name 域名; charset utf-8; access_log /var/log/nginx/webhook.iminho.me/ ...
- FastDFS install
Version: os: centos7 x64 FastDFS: 5.05 libfastcommon: latest 1. dwonload libfastcommon https://githu ...
- ccf消除类游戏
问题描述 消除类游戏是深受大众欢迎的一种游戏,游戏在一个包含有n行m列的游戏棋盘上进行,棋盘的每一行每一列的方格上放着一个有颜色的棋子,当一行或一列上有连续三个或更多的相同颜色的棋子时,这些棋子都被消 ...
- UVA-10689 Yet another Number Sequence (矩阵二分幂模板)
题目大意:已知递推公式和边缘值,求某项的最后m(0<m<5)位数字. 题目分析:矩阵二分幂的模板题. 代码如下: # include<iostream> # include&l ...
- chrome 扩展插件提示
--force-fieldtrials=ExtensionDeveloperModeWarning/None/ ogfahjpoemnbbnlignjbfinfnahmfdlk ahjaciijnoi ...
- C++静态成员变量和静态成员函数
数据成员可以分静态变量.非静态变量两种. 静态成员:静态类中的成员加入static修饰符,即是静态成员.可以直接使用类名+静态成员名访问此静态成员,因为静态成员存在于内存,非静态成员需要实例化才会分配 ...
- Swift网络封装库Moya中文手册之Providers
Providers 使用Moya,你可以通过一个 MoyaProvider 的实例发送所有网络请求,通过枚举来指定你要访问的具体API.在配置你的 Endpoint 之后,你差不多就做好了基础配置: ...