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 ...
随机推荐
- POJ-3744 Scout YYF I (矩阵优化概率DP)
题目大意:有n颗地雷分布在一条直线上,有个人的起始位置在1,他每次前进1步的概率为p,前进两步的概率为1-p,问他不碰到地雷的概率. 题目分析:定义状态dp(i)表示到了dp(i)的概率,则状态转移方 ...
- UVA-10061 How many zero's and how many digits ? (数论)
题目大意:让求n!在base进制下的位数以及末尾0的连续个数. 题目分析:一个m位的b进制数N,最小是b^(m-1),最大不超过b^m,即b^(m-1)≤N<b^m.解不等式,得log10(N) ...
- yield 关键字
yield 关键字向编译器指示它所在的方法是迭代器块.编译器生成一个类来实现迭代器块中表示的行为.在迭代器块中,yield 关键字与 return 关键字结合使用,向枚举器对象提供值.这是一个返回值, ...
- sql 2005 代码导入excel数据
select * into bm from OpenDataSource( 'Microsoft.ACE.OLEDB.12.0', 'Data Source="G:\bm.xls" ...
- div节点的操作(添加,删除,替换,克隆)
<html> <head> <title></title> <style type="text/css"> div{ b ...
- http 请求和格式
get 请求:从指定的资源请求数据. post请求:向指定的资源提交要被处理的数据. head请求:与 GET 相同,但只返回 HTTP 报头,不返回资源实体. option请求:返回服务器支持的 H ...
- Mybatis学习总结-----mybatis中refid是什么意思(十)
1.首先定义一个sql标签,一定要定义唯一id<sql id="Base_Column_List" >name,age</sql>2.然后通过id引用< ...
- JavaScript学习总结(十)——this关键字
1 <script type="text/javascript"> 2 function Person(){ 3 /*使用var 属性名定义的属性是类的私有属性,外界无 ...
- C++对象模型——默认构造函数的合成
最近在学习C++对象模型,看的书是侯捷老师的<深度探索C++对象模型>,发现自己以前对构造函数存在很多误解,作此笔记记录. 默认构造函数的误解 1.当程序猿定义了默认构造函数,编译器就会直 ...
- java request获取各种数据
我们经常需要在servlet(j2ee13.jar javax.servlet.http.HttpServletRequest)中,获取请求request的各种数据信息. 请求的URL: htt ...