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个服务器,每支队伍的初始分数 ...
随机推荐
- 微信小程序开发调试技巧
1. 查看线上小程序console a. 先打开开发小程序console b. 再打开线上小程序,此时可以查看console
- 精通Python爬虫-03-狩猎大师
声明: 本系列文章原创于慕课网,作者秋名山车神,任何人不得以任何形式在不经作者允许的情况下,进行任何形式的印刷以及销售,转载需注明出处及此声明. 本系列文章更新至少每周一更,将涉及Python爬虫基础 ...
- maven实战读书笔记(一)
环境变量设置 MAVEN_HOME:G:\maven-3.2\apache-maven-3.2.5 Path: G:\maven-3.2\apache-maven-3.2.5\bin 其实正确的设置应 ...
- pycharm 打开两个项目
1.之前用打开文件,选择一直选不到整个项目,打开也都是在已经打开的项目窗口中加载一个文件. 2.网上有介绍说设置,但是自己的pycharm经过中文汉化,许多设置项已消失不见... 3.最近打开,直接操 ...
- 进阶系列(11)—— C#多线程
一.多线程的相关概念 1.进程:是操作系统结构的基础:是一个正在执行的程序:计算机中正在运行的程序实例:可以分配给处理器并由处理器执行的一个实体:由单一顺序的执行显示,一个当前状态和一组相关的系统资源 ...
- NABCD(校园包车)
广州商学院包车 N(need) 各个高校包车需求量大,然而校园内包车信息太散乱,售票地点不确定,有些老师.学生特别是新生,甚至不知有校园包车这一回事, 随着信息网络的发展,为了给师生带来校园更多的方便 ...
- 结对作业(1.0版)(bug1已修复)
import java.awt.EventQueue; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing ...
- SGU 223 little kings BSOJ2772 状压DP
1896 [SCOI2005]互不侵犯King [问题描述]在n*n(1<=n<=10)的棋盘上放k(0<=k<=n*n)个国王(可攻击相邻的8 个格子),求使它们无法互相攻击 ...
- TCP系列54—拥塞控制—17、AQM及ECN
一.概述 ECN的相关内容是在RFC3168中定义的,这里我简单描述一下RFC3168涉及的主要内容. 1.AQM和RED 目前TCP中多数的拥塞控制算法都是通过缓慢增加拥塞窗口直到检测到丢包来进行慢 ...
- Akka系列---什么是Actor
本文已.Net语法为主,同时写有Scala及Java实现代码 严肃的说,演员是一个广泛的概念,作为外行人我对Actor 模型的定义: Actor是一个系统中参与者的虚拟人物,Actor与Actor之间 ...