【解题报告】牡丹江现场赛之ABDIK ZOJ 3819 3820 3822 3827 3829
那天在机房做的同步赛,比现场赛要慢了一小时开始,直播那边已经可以看到榜了,所以上来就知道A和I是水题,当时机房电脑出了点问题,就慢了好几分钟,12分钟才A掉第一题。。。
A.Average Score
题目大意:给定A序列和B序列,长度分别是n和m,告诉你A序列中的n-1个数和B序列的m个数,求剩下的那个A序列中的数满足:将这个数从A序列移除,然后添加到B序列,使得A序列的平均值变小,B序列的平均值变大。求这个数的取值范围(是整数)
解题思路:求出A序列剩下的n-1个数的平均值,和B序列的平均值,答案就是这两个数之间的整数。
解题代码:
#include<stdio.h>
#include<math.h>
#include<string.h>
#include<iostream>
#include<algorithm>
#define FOR(i,n) for(i=0;i<(n);i++)
#define CLR(a) memset(a,0,sizeof(a))
#define CIN(a) scanf("%d",&a)
using namespace std;
int main()
{
int t,i;
CIN(t);
while(t--)
{
int n1,n2,s1=,s2=,a,b;
CIN(n1);
CIN(n2);
for(i=;i<n1;i++)
{
CIN(a);
s1+=a;
}
for(i=;i<n2;i++)
{
CIN(b);
s2+=b;
}
if(s1%(n1-)==) s1=s1/(n1-)-;
else s1=s1/(n1-);
s2=s2/n2+;
printf("%d %d\n",s2,s1);
}
return ;
}
I.Information Entropy
然后看I感觉很高大上的样子,看了好久没看懂,但是很多人做出来又不舍得放弃,于是就静下心来慢慢看,然后发现题目的意思大概就是把给的数据带入H(x)求答案就完了。。。但是如果出现P(xi)=0的情况的话就要用那个求极限的公式带,关于这个极限,由于把高数忘得一干二净,所以不知道怎么搞,后来用几何画板把函数图像画出来,发现那个值是0,然后就简单了。。。直接套公式。。
代码:
#include<stdio.h>
#include<math.h>
#include<string.h>
#include<iostream>
#include<algorithm>
#define FOR(i,n) for(i=0;i<(n);i++)
#define CLR(a) memset(a,0,sizeof(a))
#define CIN(a) scanf("%d",&a)
using namespace std;
int a[];
double (*f)(double) ;
int main()
{
int t,i,x;
char s[];
CIN(t);
while(t--)
{
scanf("%d",&x);
scanf("%s",s);
for(i=;i<x;i++)
{
scanf("%d",&a[i]);
}
if(strcmp(s,"bit")==)
{
f=log2;
}
else if(strcmp(s,"nat")==)
{
f=log;
}
else f=log10;
double s=;
for(i=;i<x;i++)
{
if(a[i]!=) s+=((double)a[i]/)*f((double)a[i]/);
}
printf("%.12f\n",-s);
}
return ;
}
D.Domination
本着随波逐流的策略,就开始看过的人最多的D了。
题目大意:给定一个N*M的网格,开始随机往里面放棋子,知道任意一行任意一列都有棋子为止,求已经放置的棋子数的期望。
解题思路:概率DP,用dp[i][j][k]表示已经有i行,j列放过棋子,且总共放过k个棋子。对于某一状态,可以由四种状态扩展而来,可得状态转移方程:
转移方程:
if(i!=n||j!=m)dp[i][j][k]+=(1.0*i*j-(k-1))/(m*n-(k-1))*dp[i][j][k-1];//这个if是判断出前一状态已经是终点状态则不能扩展
dp[i][j][k]+=(1.0*i*(m-(j-1)))/(m*n-k+1)*dp[i][j-1][k-1];
dp[i][j][k]+=(1.0*j*(n-i+1))/(m*n-k+1)*dp[i-1][j][k-1];
dp[i][j][k]+=((1.0*n-i+1)*(m-j+1))/(m*n-k+1)*dp[i-1][j-1][k-1];
代码:
#include<stdio.h>
#include<math.h>
#include<string.h>
#include<iostream>
#include<algorithm>
#define FOR(i,n) for(i=0;i<(n);i++)
#define CLR(a) memset(a,0,sizeof(a))
#define CIN(a) scanf("%d",&a)
using namespace std;
double dp[][][];
int main()
{
int t;
int i,j,k,n,m;
CIN(t);
while(t--)
{
CIN(n);
CIN(m);
CLR(dp);
dp[][][]=;
for(i=;i<=n;i++)
{
for(j=;j<=m;j++)
{
for(k=;k<=(i*j);k++)
{
if(i!=n||j!=m)dp[i][j][k]+=(1.0*i*j-(k-))/(m*n-(k-))*dp[i][j][k-];
dp[i][j][k]+=(1.0*i*(m-(j-)))/(m*n-k+)*dp[i][j-][k-];
dp[i][j][k]+=(1.0*j*(n-i+))/(m*n-k+)*dp[i-][j][k-];
dp[i][j][k]+=((1.0*n-i+)*(m-j+))/(m*n-k+)*dp[i-][j-][k-];
//printf("dp[%d][%d][%d]=%.12f\n",i,j,k,dp[i][j][k]);
}
}
}
double s=;
for(k=;k<=(n*m);k++)
{
s+=(dp[n][m][k]*k);
}
printf("%.12f\n",s);
}
return ;
}
做到这里的时候是4题都是1y,感觉自己屌屌的~
B.Building Fire Stations
这题题目读完在纸上画了半天,感觉会和最长链有关,于是大胆猜测是在最长链的四分分上,然后马上就否定了,后来感觉应该是先将整个树从最长链的中间拆开,再分别求最长链取中点。不会证明,但是又没有别的题可以搞,就直接按这个方法写了,然后数组开太小RE了一次,改了交就AC了。。Orz白错了一次。
求树的最长链当时是第一次写,之前知道方法,但是没写过,没想到一次就过了。方法是先在树中随便取一点,遍历树找到距离这个点最远的点,然后这一点就是最长链的一个端点了,然后再从这个点遍历一次求出另一个端点就是最长链的另一点啦。
关于断边,则直接用了一个标记即可。
代码:
#include<stdio.h>
#include<math.h>
#include<string.h>
#include<iostream>
#include<queue>
#include<algorithm>
#define FOR(i,n) for(i=0;i<(n);i++)
#define CLR(a) memset(a,0,sizeof(a))
#define CIN(a) scanf("%d",&a)
using namespace std;
#include<stdio.h>
#include<string.h>
#define point_MAX 200005
#define edge_MAX 400005
struct EDGE
{
int to;/*指向的点*/
int next;/*指向的下一条邻边*/
int w;/*权值*/
}edge[edge_MAX];
int len;/*边的数量*/
int point[point_MAX];
void init()/*初始化*/
{
len=;
memset(point,,sizeof(point));
}
int add_edge(int a,int b,int w)/*添加由a指向b的权值为w的边*/
{
len++;
edge[len].w=w;
edge[len].to=b;
edge[len].next=point[a];
point[a]=len;
return ;/*无重边,插入*/
}
int del_edge(int a,int b)
{
int i;
for(i=point[a];edge[i].to!=b;i=edge[i].next);
edge[i].w=; for(i=point[b];edge[i].to!=a;i=edge[i].next);
edge[i].w=; return ;
}
int bo[];
int road[];
int zuiyuandian(int start)
{
int t,k,i;
queue<int> q;
CLR(bo);
q.push(start);
bo[start]=;
while(!q.empty())
{
//printf("l");
k=q.front();
q.pop(); for(i=point[k];i;i=edge[i].next)
{
if(edge[i].w!=)
if(bo[edge[i].to]==)
{
q.push(edge[i].to);
road[edge[i].to]=k;
bo[edge[i].to]=;
}
}
}
return k;
}
int zuichang(int start)
{
int l,r,le,i;
l=zuiyuandian(start);
r=zuiyuandian(l);
int len=;
for(i=r;i!=l;i=road[i]) {/*printf("%d->",i);*/len++;}
len/=;
for(le=,i=r;le<len;i=road[i],le++);
int a=i,b=road[i]; del_edge(a,b); l=zuiyuandian(a);
r=zuiyuandian(l);
len=;
for(i=r;i!=l;i=road[i]) len++;
int ans1=len%?len/+:len/;
len/=;
for(le=,i=r;le<len;i=road[i],le++);
a=i; l=zuiyuandian(b);
r=zuiyuandian(l);
len=;
for(i=r;i!=l;i=road[i]) len++;
int ans2=len%?len/+:len/;
len/=;
for(le=,i=r;le<len;i=road[i],le++);
b=i; printf("%d %d %d\n",max(ans1,ans2),a,b);
}
int main()
{
int t,n,i;
CIN(t);
while(t--)
{
CIN(n);
init();
for(i=;i<n;i++)
{
int a,b;
CIN(a);
CIN(b);
add_edge(a,b,);
add_edge(b,a,);
}
zuichang();
}
return ;
}
最后去搞H发现是一个模拟题,我想用map建立一棵树表示它然后查询但是超内存了Orz...一定是哪里姿势不够优美。。。SO,到最后也没搞出来,下次再搞了。
【解题报告】牡丹江现场赛之ABDIK ZOJ 3819 3820 3822 3827 3829的更多相关文章
- 2014ACM/ICPC亚洲区域赛牡丹江站现场赛-A ( ZOJ 3819 ) Average Score
Average Score Time Limit: 2 Seconds Memory Limit: 65536 KB Bob is a freshman in Marjar Universi ...
- ZOJ 3827 Information Entropy(数学题 牡丹江现场赛)
题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do? problemId=5381 Information Theory is one of t ...
- 2014ACMICPC亚洲区域赛牡丹江现场赛之旅
下午就要坐卧铺赶回北京了.闲来无事.写个总结,给以后的自己看. 因为孔神要保研面试,所以仅仅有我们队里三个人上路. 我们是周五坐的十二点出发的卧铺,一路上不算无聊.恰巧邻床是北航的神犇.于是下午和北航 ...
- 2014ACM/ICPC亚洲区域赛牡丹江现场赛总结
不知道怎样说起-- 感觉还没那个比赛的感觉呢?如今就结束了. 9号.10号的时候学校还评比国奖.励志奖啥的,由于要来比赛,所以那些事情队友的国奖不能答辩.自己的励志奖班里乱搞要投票,自己又不在,真是无 ...
- 2014 牡丹江现场赛 A.Average Score(zoj 3819) 解题报告
题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=5373 题目意思: 有两个class:A 和 B,Bob 在 Clas ...
- 2014ACM/ICPC亚洲区域赛牡丹江站现场赛-K ( ZOJ 3829 ) Known Notation
Known Notation Time Limit: 2 Seconds Memory Limit: 65536 KB Do you know reverse Polish notation ...
- ZOJ 2819 Average Score 牡丹江现场赛A题 水题/签到题
ZOJ 2819 Average Score Time Limit: 2 Sec Memory Limit: 60 MB 题目连接 http://acm.zju.edu.cn/onlinejudge ...
- 2014ACM/ICPC亚洲区域赛牡丹江站现场赛-I ( ZOJ 3827 ) Information Entropy
Information Entropy Time Limit: 2 Seconds Memory Limit: 65536 KB Special Judge Information ...
- zoj 3820(2014牡丹江现场赛B题)
题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=5374 思路:题目的意思是求树上的两点,使得树上其余的点到其中一个点的 ...
随机推荐
- POJ 1733 Parity game (带权并查集)
题意:有序列A[1..N],其元素值为0或1.有M条信息,每条信息表示区间[L,R]中1的个数为偶数或奇数个,但是可能有错误的信息.求最多满足前多少条信息. 分析:区间统计的带权并查集,只是本题中路径 ...
- Linux工作管理 jobs、fg、bg、nohup命令
概述 在Linux 中我们登陆了一个终端,已经在执行一个操作,可以通过一定的操作或命令在不关闭当前操作的情况下执行其他操作. 例如,我在当前终端正在 vi 一个文件,在不停止 vi 的情况下,如果我想 ...
- with as (cte common table expression) 公共表表达式
SQL中 with as 的用法——使用公用表表达式(CTE) 公用表表达式 (CTE) 可以认为是在单个 SELECT.INSERT.UPDATE.DELETE 或 CREATE VIEW 语句的 ...
- nor flash的一般操作与分析
是现在市场上两种主要的非易失闪存技术.Intel于1988年首先开发出NOR Flash 技术,彻底改变了原先由EPROM(Electrically Programmable Read-Only-Me ...
- [HEOI2016/TJOI2016]求和(第二类斯特林数)
题目 [HEOI2016/TJOI2016]求和 关于斯特林数与反演的更多姿势\(\Longrightarrow\)点这里 做法 \[\begin{aligned}\\ Ans&=\sum\l ...
- const修饰的常量 不能被直接修改 但是可以通过指针进行间接修改
大家都知道如下代码中,被const限定的a是不可以被直接修改的 void main() { const int a = 3; a=1; } 在C++中const修饰的常量,不能被直接修改,但是可以通过 ...
- 《Maven实战》第13章 版本管理
版本管理:项目整体版本的演变过程的管理,如从1.0-SNAPSHOT到1.0,再到1.1-SNAPSHOT 版本控制:借助版本控制工具追踪代码的每一个变更 13.1什么是版本管理 版本管理:项目整体版 ...
- Spring_自动装配
Beans-autowire.xml <?xml version="1.0" encoding="UTF-8"?><beans xmlns=& ...
- Oracle中清除BIN$开头的垃圾表的解决办法 [转]
oracle drop table的时候,不会彻底删除该表,它将drop的表放到了自己的回收站里,放到回收站的表就是我们看到的形如bin$/rt62vkdt5wmrjfcz28eja==$0的表,其中 ...
- [POI2009]Lyz
Description 初始时滑冰俱乐部有1到n号的溜冰鞋各k双.已知x号脚的人可以穿x到x+d的溜冰鞋. 有m次操作,每次包含两个数ri,xi代表来了xi个ri号脚的人.xi为负,则代表走了这么多人 ...