18华南理工校赛 K 小马哥的超级盐水
https://www.nowcoder.com/acm/contest/94/K
sum(ai)/sum(bi) = x/y
<=>
sum(ai*yi-bi*x) = 0
跟这题有点类似 https://www.nowcoder.com/acm/contest/93/I
总值分成两部分,x+y=k。(这里k=0)
求出前半部分值为x的情况,求出后半部分值为y的情况。
c++ map 记录
时间复杂度
原来:2^n
现在:
分成大小最接近的两部分,每部分分别有(n+1)/2 , n/2 个数
2^( (n+1)/2 ) + 2^(n/2) + 对于第二部分的每个值y,得找第一部分值为k-y的情况数目,其中第一部分的值是排序的,寻找需要O(log( 2^( (n+1)/2 ) )=O( (n+1)/2 ) ,总共需要 O( (n+1)/2 * 2^(n/2) )。
所以第一部分的数目为(n+1)/2比较好,否则部分时间复杂度:O( n/2 * 2^((n+1)/2) )
关于结果是否使用高精度:
假设最坏的情况,35个数中,ai*yi-bi*x=1的数有18个,ai*yi-bi*x=-1的数有17个,如y=2,x=3,b=3,a=4或5。
则结果为:
C(18,17)*C(17,17) + C(18,16)*C(17,16) + … + C(18,0)*C(17,0)
<= C(18,18)*C(18,18) + C(18,17)*C(18,17) + … + C(18,0)*C(18,0)
<= ( C(18,18)+C(18,17)+…+C(18,0) ) ^ 2
= 2^36
long long 能解决
这数值比我想象中的要小
也许这个方案不是值最大的方案,但感觉这就是值最大的方案……
dfs:
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <list>
#include <stack>
#include <vector>
#include <set>
#include <map>
#include <queue>
#include <algorithm>
#include <iostream>
using namespace std; map<long,long long> f;
long p[],q[],n,m,x,y;
long long sum; void dfs(long step,long a,long b)
{
if (step==m)
f[a*y-b*x]++;
else
{
dfs(step+,a,b);
dfs(step+,a+p[step],b+q[step]);
}
} void DFS(long step,long a,long b)
{
if (step==n)
sum+=f[-a*y+b*x];
else
{
DFS(step+,a,b);
DFS(step+,a+p[step],b+q[step]);
}
} int main()
{
map<long,long long>::iterator j;
long t,i;
long long total;
scanf("%ld",&t);
while (t--)
{
scanf("%ld%ld%ld",&n,&x,&y);
for (i=;i<n;i++)
scanf("%ld%ld",&p[i],&q[i]);
m=(n>>)+;
f.clear();
sum=;
dfs(,,);
DFS(m,,);
printf("%lld\n",sum-);
}
return ;
}
位运算:
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <list>
#include <stack>
#include <vector>
#include <set>
#include <map>
#include <queue>
#include <algorithm>
#include <iostream>
using namespace std; map<long,long long> f;
long p[],q[],n,m,mm,x,y;
long long sum; int main()
{
long t,i,j,pp,qq;
scanf("%ld",&t);
while (t--)
{
scanf("%ld%ld%ld",&n,&x,&y);
for (i=;i<n;i++)
scanf("%ld%ld",&p[i],&q[i]);
f.clear();
sum=;
m=(n+)>>;
for (i=;i<(<<m);i++)
{
pp=; qq=;
for (j=;j<m;j++)
if (((i>>j) & )==)
{
pp+=p[j];
qq+=q[j];
}
f[pp*y-qq*x]++;
} mm=n>>;
for (i=;i<(<<mm);i++)
{
pp=; qq=;
for (j=;j<mm;j++)
if (((i>>j) & )==)
{
pp+=p[m+j];
qq+=q[m+j];
}
sum+=f[-pp*y+qq*x];
}
printf("%lld\n",sum-);
}
return ;
}
超时:
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <vector>
#include <set>
#include <map>
#include <queue>
#include <stack>
#include <algorithm>
#include <iostream>
using namespace std; //actually a=3,b=4,5 ; x=2,y=3 ÐèÒª¸ß¾«¶È
//10000*10000*35
map<unsigned long,long long> f;
stack<pair<unsigned long,long long> > st; int main()
{
map<unsigned long,long long>::iterator j;
long t,n,x,y,i,a,b,c;
scanf("%ld",&t);
while (t--)
{
scanf("%ld%ld%ld",&n,&x,&y);
f[]=;
for (i=;i<=n;i++)
{
scanf("%ld%ld",&a,&b);
c=a*y-b*x;
while (!st.empty())
st.pop();
for (j=f.begin();j!=f.end();j++)
st.push(make_pair(j->first,j->second));
while (!st.empty())
{
f[st.top().first+c]+=st.top().second;
st.pop();
}
}
printf("%lld\n",f[]-);
}
return ;
}
内存超限:
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <vector>
#include <set>
#include <map>
#include <queue>
#include <stack>
#include <algorithm>
#include <iostream>
using namespace std; //actually a=3,b=4,5 ; x=2,y=3 ÐèÒª¸ß¾«¶È
//10000*10000*35
map<unsigned long,long long> f,f1;
stack<pair<unsigned long,long long> > st; int main()
{
map<unsigned long,long long>::iterator j;
long t,n,x,y,i,a,b,c;
long long total;
scanf("%ld",&t);
while (t--)
{
scanf("%ld%ld%ld",&n,&x,&y);
f[]=;
for (i=;i<=n/;i++)
{
scanf("%ld%ld",&a,&b);
c=a*y-b*x;
while (!st.empty())
st.pop();
for (j=f.begin();j!=f.end();j++)
st.push(make_pair(j->first,j->second));
while (!st.empty())
{
f[st.top().first+c]+=st.top().second;
st.pop();
}
} f1[]=;
for (i=;i<=(n+)/;i++)
{
scanf("%ld%ld",&a,&b);
c=a*y-b*x;
while (!st.empty())
st.pop();
for (j=f1.begin();j!=f1.end();j++)
st.push(make_pair(j->first,j->second));
while (!st.empty())
{
f1[st.top().first+c]+=st.top().second;
st.pop();
}
}
total=;
for (j=f1.begin();j!=f1.end();j++)
total+=f1[j->second]*f[-f1[j->first]];
printf("%lld\n",total-);
}
return ;
}
18华南理工校赛 K 小马哥的超级盐水的更多相关文章
- 2019年华南理工校赛(春季赛)--L--剪刀石头布(签到)
#include <iostream> using namespace std; int main(){ string a,b,c,d; a="Scissors"; b ...
- 2019年华南理工校赛(春季赛)--I--炒股(简单思维水题)
水题,想想就过了 题目如下: 链接:https://ac.nowcoder.com/acm/contest/625/I来源:牛客网 攒机一时爽,一直攒机一直爽. 沉迷攒机的胡老师很快就发现,他每天只能 ...
- 长沙理工校赛I题题解-连续区间的最大公约数
题目来源https://www.nowcoder.com/acm/contest/96/I 解题前们需要先知道几个结论: 首先,gcd是有区单调性的: gcd(L,R)>=gcd(L,R+d) ...
- 牛客-长沙理工校赛C-取手机
传送门:https://www.nowcoder.com/acm/contest/96/C 参考:http://www.cnblogs.com/Dillonh/p/8835074.html 题意: d ...
- 2017 湖南省赛 K Football Training Camp
2017 湖南省赛 K Football Training Camp 题意: 在一次足球联合训练中一共有\(n\)支队伍相互进行了若干场比赛. 对于每场比赛,赢了的队伍得3分,输了的队伍不得分,如果为 ...
- 18/9/21模拟赛-Updated
18/9/21模拟赛 期望得分:100:实际得分:0 qwq 拿到题目第一眼,我去,这不是洛谷原题(仓鼠找Sugar)吗 又多看了几眼,嗯,对,除了是有多组数据外,就是原题 然后码码码....自以为 ...
- 2019-ACM-ICPC-沈阳区网络赛-K. Guanguan's Happy water-高斯消元+矩阵快速幂
2019-ACM-ICPC-沈阳区网络赛-K. Guanguan's Happy water-高斯消元+矩阵快速幂 [Problem Description] 已知前\(2k\)个\(f(i)\),且 ...
- hdu5080:几何+polya计数(鞍山区域赛K题)
/* 鞍山区域赛的K题..当时比赛都没来得及看(反正看了也不会) 学了polya定理之后就赶紧跑来补这个题.. 由于几何比较烂写了又丑又长的代码,还debug了很久.. 比较感动的是竟然1Y了.. * ...
- ZOJ 3879 Capture the Flag 15年浙江省赛K题
每年省赛必有的一道模拟题,描述都是非常的长,题目都是蛮好写的... sigh... 比赛的时候没有写出这道题目 :( 题意:首先输入4个数,n,q,p,c代表有n个队伍,q个服务器,每支队伍的初始分数 ...
随机推荐
- 设计与实现分离——面向接口编程(OO博客第三弹)
如果说继承是面向对象程序设计中承前启后的特质,那么接口就是海纳百川的体现了.它们都是对数据和行为的抽象,都是对性质和关系的概括.只不过前者是纵向角度,而后者是横向角度罢了.今天呢,我想从设计+语法角度 ...
- 2018-2019-20172329 《Java软件结构与数据结构》第八周学习总结
2018-2019-20172329 <Java软件结构与数据结构>第八周学习总结 现在对于我而言,最珍贵的是时间,感觉自己在时间飞逝的时候真的挽留不住什么,只能怒发冲冠的让自己疯狂的学习 ...
- Chapter 6 面向对象基础
面向对象=对象+类+继承+通信,如果一个软件系统采用这些概念来建立模型并给予实现,那么它就是面向对象的.面向对象的软件工程方法是面向对象方法在软件工程领域的全面运用涉及到从面向对象分析.面向对象设计. ...
- c++ imooc自学计划
一.视频学习相关的课程列表: C++远征之起航篇http://www.imooc.com/learn/342: C++远征之离港篇http://www.imooc.com/learn/381: C++ ...
- 调研Android的开发环境的发展演变
在 知道要做基于移动端的项目实践时,我就选定了Android,回来的时候查了很多相关的知识,很多人都在问开发安卓软件,使用eclipse还是用 Android studio?其实,也没有一个准确的答案 ...
- Eclipse下使用Git
安装Git 有的eclipse已经自带了Git了,就不用安装了. 如果,想重新安装,可以先卸载git,卸载 不同eclipse卸载不一样: 1.在Eclipse中依次点击菜单"Help&qu ...
- [51单片机] Keil C51中变量的使用方法详解
引言 8051内核单片机是一种通用单片机,在国内占有较大的市场份额.在将C语言用于51内核单片机的研究方面,Keil公司做得最为成功.由于51内核单片机的存储结构的特殊性,Keil C51中变量 ...
- AG-Admin微服务框架入门
AG-Admin微服务框架入门 @qq群:一群: 837736451 二群 169824183 一 概要介绍 AG-Admin后台地址:https://gitee.com/minull/ace-s ...
- 性能分析_linux服务器CPU_CPU利用率
CPU度量 1. 指标范围 1.1 User mode CPU utilization+ System mode CPU utilization 合理值:60-85%,如果在一个多用户系统中us+ ...
- mac下面安装redis
本文只记录了在homebrew下面安装redis的过程,过程比较简单,作为自己以后翻阅用吧, 首先安装homebrew,打开终端,在终端下面允许下面的命令(不要用root用户): /usr/bin/r ...