博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
hihocoder [Offer收割]编程练习赛14
阅读量:6840 次
发布时间:2019-06-26

本文共 4417 字,大约阅读时间需要 14 分钟。

A.

谜之第1题,明明是第1题AC率比C还要低。题目是求在n个不同重量袋子选4袋,2袋给A,2袋给B,使2人获得重量相同,求问方案数。

我也是一脸懵b。。。o(n2)暴力枚举发现把第i行列和第j行列去掉,再求剩下的a[i]+a[j]数就是解

用容斥,要把(i,i)(i,j)(j,i)(j,j)加回来,想o(n3),结果tle

结果发现求结果时只求a[i]+a[j]个数就行了,只需改变跟a[i]+a[j]有关的计数就可以了。

还要有一个计数器,储存每个数字分别有多少个

然后直接计数与a[i]+a[j]相关数据

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;typedef long long ll;int h[2000010];int a[1010];int c[1000010];int main(){ int i,n,j,k; memset(h,0,sizeof(h)); memset(c,0,sizeof(c)); scanf("%d",&n); for(i=0;i
View Code

 

B.

意外地很简单。dp一波,dp[n,i]表示银币投n次正好i次向上的概率,然后

dp(n,i)=dp(n-1,i)*(1-p(n))+dp(n-1,i-1)*p(n),解决

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;typedef long long ll;double p[1010];double dp[2][1010];int main(){ int i,j,m,n; scanf("%d%d",&n,&m); for(i=0;i
View Code

 

C.

题目大意就是求去除某边使n个边的有向无环图变成n-1条边的有向无环图的边编号集合

这里不是判个圈就解决的,不仅要让有向树只有1个0入度点(编号还必须是1),并且所有0出度点只有1个入度

所以判完圈后,还要把标记在圈上的边分别操作,并判断0入度点数和0入度点是不是1号

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;const int N =100010;int head[2][N],cnt[2]={ 0,0};int to[2][N<<1],next1[2][N<<1];bool isCircle[N<<1];bool vis[N];bool ans[N];void addedge(int u,int v,int i){ to[i][cnt[i]]=v; next1[i][cnt[i]]=head[i][u]; head[i][u]=cnt[i]++;}int dfs(int u,int eno){ vis[u]=true; int cn=-1; for(int i=head[1][u];i!=-1;i=next1[1][i]) { if(i == (eno^1)) continue; int v=to[1][i]; if(vis[v]) { cn=v; isCircle[i/2]=true; vis[u]=false; return cn; } cn = dfs(v,i); if(cn!=-1) { isCircle[i/2]=true; vis[u]=false; if(cn == u) return -1; return cn; } } vis[u]=false; return cn;}int inc[N],ouc[N];int e[N][2];int main(){ memset(head,-1,sizeof(head)); memset(vis,0,sizeof(vis)); memset(isCircle,0,sizeof(isCircle)); memset(inc,0,sizeof(inc)); memset(ouc,0,sizeof(ouc)); memset(ans,0,sizeof(ans)); int i,n,u,v; scanf("%d",&n); int in0=n; for(i=0;i
View Code

 

D.

虽说最近搞了MVPTree,也是跟查询点有关。。。但是这题没有给确定点,没法搞~~场上没做

题目不能O(n3)(就是两两确定点,再向外探索点确定个数),会超时

看了其他人的代码后才领悟,敢情是极角排序

看下图就知道是怎么回事了。。。点要跟O点距离原点不足R,那么以自身点为中心,R半径的圆与O圆(半径同样为R)相交部分就是原点的可选范围。

再加入一个点,只要对应圆也包含原来可选范围的一部分,这一部分的原点画的圆也能包含新点

就像这样:

 

红色区域包含3个圆,仔细观察就会发现其实就是蓝色扇形与棕色扇形对应角相交的部分

可以大胆推断,新点与O点相交角包含区域可默认为可选区域

区域包含的角越多,包含的对应点也越多

然后代码就是这样:(场上排第2名的代码,除开排版问题比较容易看懂)

#include 
#include
#include
#include
#define Mn 2005//平面点集中点数using namespace std;const double eps = 1e-9;//精度调高点没跑~const double pi = acos(-1.0);#define sqr(x) ((x) * (x))double R;//定长struct point{ double x,y; void read() { scanf("%lf%lf",&x,&y); } void print() { printf("%lf%lf\n",x,y); } double friend dis(const point &a,const point &b) { return sqrt(sqr(a.x - b.x) + sqr(a.y - b.y)); }} p[Mn + 5];struct alpha{ double v; bool flag; bool friend operator <(const alpha &a,const alpha &b)//排序专用偏序关系 { return a.v < b.v; }} alp[Mn * Mn + 5]; //C(N,2)*2的可能交点(可能极角)void solve(int n,int r){ R = r;//本题内为单位圆 for(int i = 0; i < n; i++) p[i].read(); int MAX = 0; for(int i = 0; i < n; i++) { int t = 0; for(int j = 0; j < n; j++) { if(i == j) continue; double theta,phi,D; D = dis(p[i],p[j]); if(D > 2.0 * R)//距离超界直接秒杀 continue;//关键部分 theta = atan2(p[j].y - p[i].y,p[j].x - p[i].x); if(theta < 0) theta += 2 * pi; phi = acos(D / (2.0 * R)); alp[t].v = theta - phi + 2 * pi; alp[t].flag = true; alp[t + 1].v = theta + phi + 2 * pi; alp[t + 1].flag = false; t += 2; } sort(alp,alp + t); int sum = 0; for(int j = 0; j < t; j++) { if(alp[j].flag) sum ++; else sum --; if(sum > MAX) MAX = sum; } } printf("%d\n",MAX + 1);}int main(){ int n,r; while(~scanf("%d%d",&n,&r)) { solve(n,r); }}
View Code

 

转载于:https://www.cnblogs.com/dgutfly/p/6718983.html

你可能感兴趣的文章
使用C#创建及调用WCF完整实例 (Windows服务宿主)
查看>>
记录一次条件比较多的SQL查询语句
查看>>
Geolocation地理定位
查看>>
Ajax beforeSend和complete 方法
查看>>
webpack 编译图片文件 file-loader
查看>>
RabbitMQ Topic exchange
查看>>
Java多线程:死锁
查看>>
c++ poco StreamSocket tcpclient测试用例
查看>>
hive的row_number()函数
查看>>
js随机码之乱序数组
查看>>
C#绘制三角形并填充,使用winform实现qq聊天气泡
查看>>
(转)在Eclipse中用TODO标签管理任务(Task)
查看>>
17秋 软件工程 团队第五次作业 Alpha Scrum5
查看>>
图数据库Neo4j简介
查看>>
linux使用ip能ping通,但使用域名却不能访问的解决方法
查看>>
3.SOAP和WSDL的一些必要知识
查看>>
SQL语句统计每天、每月、每年的数据
查看>>
使用maven创建工程报错Could not resolve archetype org.apache.maven.archetype
查看>>
PHP Manager 安装失败的解决方法, PHP Manager 1.4 for IIS 10,经验证支持windows server 2016版本...
查看>>
19. Spring Boot Shiro 权限管理
查看>>