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个服务器,每支队伍的初始分数 ...
随机推荐
- [持久更新] 剑指offer题目Python做题记录
第一题 题目:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 思路:先快速定位到 ...
- Linux虚拟机安装教程
必备组件: vmware(程序主题) 链接:https://pan.baidu.com/s/14OplOGOQTVAnf0iDqgDhDQ 提取码:jape centos(Linux系统) 链接:ht ...
- 第十次ScrumMeeting博客
第十次ScrumMeeting博客 本次会议于11月5日(日)22时整在新主楼G座2楼召开,持续20分钟. 与会人员:刘畅.辛德泰.窦鑫泽.张安澜.赵奕.方科栋. 特邀嘉宾:陈彦吉学长. 1. 每个人 ...
- (第十周)Beta-2阶段成员贡献分
项目名:食物链教学工具 组名:奋斗吧兄弟 组长:黄兴 组员:李俞寰.杜桥.栾骄阳.王东涵 个人贡献分=基础分+表现分 基础分=5*5*0.5/5=2.5 成员得分如下: 成员 基础分 表现分 个人贡献 ...
- No.1000_第五次团队会议
光辉的一夜 今夜注定是不平凡的一夜.是崔强同学伟大的一夜. 昨天因为实验室项目,我刚上完编译课就被学院叫走去做项目,当时我就很无奈,因为说好了要和崔强一起实现下午的前端,他写界面我写底层逻辑,这样我们 ...
- 团队项目-NABCD
用户需求分析与NABCD 模拟经营类(SIM)游戏:玩家模拟经营一家软件公司,平台初步定为Android. Need需求 任何一款游戏都要有自己的定位和目标群体,这些 iiMediaResearch数 ...
- Leetcode题库——13.罗马数字转整数
@author: ZZQ @software: PyCharm @file: Luoma2Int.py @time: 2018/9/16 17:06 要求: 罗马数字转数字 字符 数值 I 1 V 5 ...
- Windows服务器安全配置指南
1).系统安全基本设置 2).关闭不需要的服务 Computer Browser:维护网络计算机更新,禁用 Distributed File System: 局域网管理共享文件,不需要禁用 Distr ...
- ns3 回调机制
(1)目的:为了实现两个模块之间的通信(这两个模块没有任何依赖关系) (2) C语言中的函数指针 int (*a)(int q) = 0; //声明一个函数指针a,初始值设为0 //. //. //. ...
- PythonWeb 服务部署文档及迁移到Linux相关
pythonWeb的部署(Django+Uwsgi): 1. 部署服务器上需要的Python3.6环境: 安装集成了python3.6 和pip ,virtualenv虚拟环境 的Anaconda(A ...