题目名称 穿越七色虹 四叶草魔杖 圣主的考验
程序文件 rainbow clover domine
输入文件 rainbow.in clover.in domine.in
输出文件 rainbow.out clover.out domine.out
每个测试点时限 1 秒 1 秒 2 秒
内存限制 128 MB 128 MB 256 MB
代码长度限制 4096 B
测试点数目 10 10 10
每个测试点分值 10 10 10
是否有部分分

评测环境: Intel(R) Core(TM) i3-370M CPU @2.40GHz 2.39GHz, 2.00GB RAM Cena 0.8.2 @ Windows 8 Enterprise x64 C++选手可以使用 %lld 或%I64d 输入输出 64 位整数。 最终评测时,所有编译命令均不打开任何优化开关。

穿越七色虹(rainbow.pas/c/cpp)

题目背景

在 Nescafe27 和 28 中,讲述了一支探险队前往 Nescafe 之塔探险的故事…… 当两位探险队员以最快的时间把礼物放到每个木箱里之后,精灵们变身为一缕缕金带似
的光,簇簇光芒使探险队员们睁不开眼睛。待一切平静下来之后,探险队员来到了一座宫殿 中,玉制的石椅上坐着两个人…… “你们就是……Nescafe 之塔护法中的两位?” “是的,我们就是神刀护法 xlk 和飞箭护法 riatre……你们来这里做什么?” “我们是前来拜访圣主和四位护法的……” “如果你们想见圣主和其它两位护法,你们必须穿过前方的七色彩虹。请随我来吧……”

题目描述

探险队员们跟随两位护法来到了七色虹前。七色虹,就是平面直角坐标系中赤橙黄绿青 蓝紫七个半圆,第 i 座(1<=i<=7)半圆形彩虹的圆心是(xi,0),半径是 ri,半圆上所有点的纵坐 标均为非负数。探险队员可以看做一条竖直的、长度等于身高的线段,线段的底端纵坐标为 0,最高的一位探险队员的身高为 h。 现在探险队员们要从(0,0)穿越七色虹到达(x0,0),穿越七色虹的过程中,探险队员的整 个身体必须始终在至少一个半圆形彩虹的内部。由于彩虹的半径 ri 可能太小了,不足以满 足这个条件,因此两位护法决定帮助他们把所有彩虹的半径都增大一个非负实数 r。探险队 员们想知道,r 最小是多少呢?

输入格式

第一行两个实数 h、x0,表示身高和目的地横坐标。 接下来七行每行两个实数 xi、ri,表示七座半圆形彩虹的圆心和半径。

输出格式

输出最小的 r,四舍五入保留 2 位小数。

样例输入

4.0 36.0

0.0 4.0

6.0 4.0

12.0 4.0

18.0 4.0

24.0 4.0

30.0 4.0

36.0 4.0

样例输出

1.00

数据范围与约定

对于 100% 的数据,满足 0<=xi,x0<=10000,0<h<100

题解

有点小小技巧的二分,其实嘛,二分我还是看出来了,但是只是傻到用各种特判卡(傻x)。其实人的高度是一定的,圆的半径是一定的,那么人在这个圆里可以活动的空间就是一个长度确定的线段,最后完美转换为区间覆盖问题。

#include <cstdio>
#include <iostream>
#include <cstring>
#include <cmath>
#include <algorithm>using namespace std;double h,x0;
double x[10],r[10];struct line{double l,rr;
}t[10];bool cmp(line a,line b){return a.l<b.l;
}bool check(double ins)
{for(int i=1;i<=7;i++)r[i]+=ins;for(int i=1;i<=7;i++){double dis=sqrt(r[i]*r[i]-h*h);t[i].l=x[i]-dis;t[i].rr=x[i]+dis;} sort(t+1,t+1+7,cmp);double end=0;for(int i=1;i<=7;i++){if(end>x0)return true;if(end<t[i].l)return false;end=t[i].rr;end=max(end,t[i].rr);}if(end<x0)return false;return true;
}int main()
{freopen("rainbow.in","r",stdin);freopen("rainbow.out","w",stdout);cin>>h>>x0;double ans;for(int i=1;i<=7;i++)scanf("%lf%lf",&x[i],&r[i]);double l=0,rr=10000;while(l+0.0001<rr){double mid=(l+rr)/2;if(!check(mid)){ans=l=mid;}else rr=mid;for(int i=1;i<=7;i++)r[i]-=mid;}printf("%.2f",ans);return 0;
} 

四叶草魔杖(clover.pas/c/cpp)

题目背景

陶醉在彩虹光芒笼罩的美景之中,探险队员们不知不觉已经穿过了七色虹,到达了目的 地,面前出现了一座城堡和小溪田园,城堡前的木牌上写着“Poetic Island”。 “这一定就是另外两位护法的所在地了……我们快进去吧!” 探险队员们快步进入了城堡,城堡大厅的羊毛沙发上坐着两个人。 “你们是 Nescafe 的护法吧?” “是的哦~ 我们就是圣剑护法 rainbow 和魔杖护法 freda~ 你们来这里做什么呢~” “我们是来拜访圣主和四位护法的……” “可是圣主 applepi 已经前往超自然之界的学校(Preternatural Kingdom University,简 称 PKU)修炼魔法了,要想见到他,必须开启 Nescafe 之塔与超自然之界的通道。但是圣主 规定,开启通道的方法不能告诉任何外人。我只能提示你们,开启通道的钥匙就与四位护法 有关 T_T” 探险队员环视四周,突然,其中一人的目光停留在了魔杖之上。“hoho~ 魔杖!传说中 开启异时空通道的钥匙不就叫四叶草魔杖吗?四叶草有力量、信心、希望和幸运四片叶子, 护法恰好有神刀、飞箭、圣剑、魔杖四位!aha~我找到答案了!” “好吧,那我们就满足你们的愿望~”

题目描述

魔杖护法 Freda 融合了四件武器,于是魔杖顶端缓缓地生出了一棵四叶草,四片叶子幻 发着淡淡的七色光。圣剑护法 rainbow 取出了一个圆盘,圆盘上镶嵌着 N 颗宝石,编号为 0~N-1。第 i 颗宝石的能量是 Ai。如果 Ai>0,表示这颗宝石能量过高,需要把 Ai 的能量传 给其它宝石;如果 Ai<0,表示这颗宝石的能量过低,需要从其它宝石处获取-Ai 的能量。保 证∑Ai =0。只有当所有宝石的能量均相同时,把四叶草魔杖插入圆盘中央,才能开启超自 然之界的通道。 不过,只有 M 对宝石之间可以互相传递能量,其中第 i 对宝石之间无论传递多少能量, 都要花费 Ti 的代价。探险队员们想知道,最少需要花费多少代价才能使所有宝石的能量都 相同?

输入格式

第一行两个整数 N、M。 第二行 N 个整数 Ai。 接下来 M 行每行三个整数 pi,qi,Ti,表示在编号为 pi 和 qi 的宝石之间传递能量需要花 费 Ti 的代价。数据保证每对 pi、qi 最多出现一次。

输出格式

输出一个整数表示答案。无解输出 Impossible。

样例输入

3 3

50 -20 -30

0 1 10

1 2 20

0 2 100

样例输出

30

数据范围与约定

对于 50% 的数据,2<=N<=8。

对于 100% 的数据,2<=N<=16,0<=M<=N*(N-1)/2,0<=pi,qi<N,-1000<=Ai<=1000, 0<=Ti<=1000,∑Ai=0。

题解与分析

本题的做法应该是floyd传递闭包+状态dp(noip要是出这种题直接gg),首先floyd传递闭包是什么意思??其实就是求两点之间的最短距离,由于这个题目中的图是可以不互相连通,所以做完floyd之后就会得到一些彼此独立的互相连通图,然后,再对每一个分图统计出一些点集,满足于{a[i]}的加和为0,那么这些就是一些部分答案,要求所有点满足加和为0的状态,如果要求最优,就必须动规(状态)了。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#define INF (1<<29)
#define LL long long
using namespace std;
int N,M,A[20];
int mp[20][20];
bool Zp[20],vis[20];
int Cm[20][20],cnt;
int trs(int x){return (1<<x);}
int rtrs(int x){int rtn=1;while(trs(rtn)!=x)rtn++;return rtn;}
void read(){scanf("%d%d",&N,&M);for(int i=1;i<=N;i++)scanf("%d",&A[i]);for(int i=1;i<=N;i++)for(int j=1;j<=N;j++)mp[i][j]=INF;for(int i=1;i<=M;i++){int x,y,z;scanf("%d%d%d",&x,&y,&z);x++;y++;mp[x][y]=z;mp[y][x]=z;}
}
void Floyd(){for(int k=1;k<=N;k++)for(int i=1;i<=N;i++)for(int j=1;j<=N;j++)if(i!=j&&mp[i][j]>mp[i][k]+mp[k][j])mp[i][j]=mp[i][k]+mp[k][j];
}
void checkzp(){for(int i=1;i<=N;i++)if(!A[i])Zp[i]=true;
}
void dfs(int k){vis[k]=true;Cm[cnt][++Cm[cnt][0]]=k;for(int i=1;i<=N;i++)if(!vis[i]&&!Zp[i])dfs(i);
}
void getset(){for(int i=1;i<=N;i++)if(!vis[i]&&!Zp[i]){cnt++;dfs(i);}
}
bool checksum(){for(int i=1;i<=cnt;i++){int sum=0;for(int j=1;j<=Cm[cnt][0];j++)sum+=A[Cm[cnt][j]];if(sum!=0)return false;}return true;
}
int bag[65536],tot,val[262144],F[262144];int Fa[20];
void Pre(){for(int i=1;i<=N;i++)Fa[i]=i;}
int Find(int x){return Fa[x]==x?x:Fa[x]=Find(Fa[x]);}
void Merge(int x,int y){Fa[Find(x)]=Find(y);}struct edge{int a,b,t;edge(int aa=0,int bb=0,int tt=0){a=aa;b=bb;t=tt;}
}E[65536];int Et;
bool cmp(edge x,edge y){return x.t<y.t;}
void add(int x,int y,int z){E[++Et]=edge(x,y,z);}
int MST(int St){Et=0;memset(E,0,sizeof(E));for(int i=1;i<N;i++)if(trs(i)&St)for(int j=i+1;j<=N;j++)if(trs(j)&St)if(mp[i][j]!=INF)add(i,j,mp[i][j]);sort(E+1,E+1+Et,cmp);Pre();int rtn=0;for(int i=1;i<=Et;i++){int x=E[i].a,y=E[i].b;if(Find(x)!=Find(y)){Merge(x,y);rtn+=E[i].t;}}return rtn;
}
void search(int c,int k,int t,int sum,int St){if(k>t+1)return;if(St&&!sum){bag[++tot]=St;val[St]=MST(St);}int p=Cm[c][k];search(c,k+1,t,sum+A[p],St|trs(p));search(c,k+1,t,sum,St);
}
void getbag(){for(int i=1;i<=cnt;i++)search(i,1,Cm[i][0],0,0);
}
void DP(){int Suc=0;for(int i=1;i<=N;i++)if(!Zp[i])Suc|=(1<<i);for(int i=2;i<=Suc;i+=2)F[i]=INF;for(int i=1;i<=tot;i++){int s1=bag[i];F[s1]=val[s1];for(int j=1;j<=tot;j++){int s2=bag[j];F[s1|s2]=min(F[s1|s2],F[s2]+val[s1]);}}printf("%d\n",F[Suc]);
}
int main(){freopen("clover.in","r",stdin);freopen("clover.out","w",stdout);read();Floyd();checkzp();getset();if(!checksum()){printf("Impossible");return 0;}getbag();DP();
} /*
3 3
50 -20 -30
0 1 10
1 2 20
0 2 100 */

圣主的考验(domine.pas/c/cpp)

题目背景

随着四叶草魔杖的插入,Nescafe 之塔的塔尖附近出现了光漩涡。随着一束光芒投下, 探险队员们面前出现了圣主的身影。 “参见圣主!” “大家好,我叫杜宇飞。我就是 Nescafe 的圣主 applepi。” “圣主,我们是专程前来拜访您的!”探险队员们万分激动。 “再有七天就是 Nescafe 镇塔之宝一年一度的封印之期了,你们可以留下来观看封印。 不过在这之前,我还是想考考你们……”

题目描述

若对于二叉树 T 的每个节点 v,其左子树的高度 L 和右子树的高度 R 均满足|L – R|≤1, 则这个树 T 有可能来自超自然之界。规定若某节点子树为空,则该子树的高度是 0。你的任 务是求有 N 个节点的可能来自超自然之界的树的数目。

输入格式

每个测试点包含若干个测试数据。 每个测试数据占一行,包含一个整数 N。 输入文件以 0 结尾。

输出格式

对于每个测试数据,在单独的一行内输出结果。由于结果可能会很大,你只需要输出答 案在十进制表示下的后九位。若答案不足九位,只需输出原答案。

样例输入

2

3

5

30

0

样例输出

2

1

6

11307920

数据范围与约定

对于 30% 的测试点,N≤100。 对于 70% 的测试点,N≤1000。 对于 100% 的测试点,1≤N≤3000。

题解

我觉得是一个真的好题,其实我现在也不能很流畅的梳理思路,我试一下吧。首先对于一个高度确定的二叉树,组成他的节点个数的范围是可以确定的。很容易的想到,如果是一颗满二叉树,那么他包含的节点个数一定最多。那么最小的情况呢?其实可以想到一个递推式Min[h]=Min[h-1]+Min[h-2]+1;因为一个满足条件的二叉树只有左右子树不相等,才可以省下个数;所以根据这个高度的范围,我们可以找到n个节点对应h最小的情况,即n<=Max[h].满二叉树的情况一定是高度最小。然后h可以再n>=min[h]里枚举,这个范围比较小。N是不变的,min[h]是n个节点高度最高的情况(由min的定义可以得知);然后类似的左子树也可以这样枚举,加上dp这道题就差不多了;其实吧,对于现在的我还是不是很好想的(QAQ,真的菜

#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <iostream>
#define mod 1000000000
using namespace std;
typedef long long LL;int a[3005],cnt,maxn=-1;
LL f[3005][200],Min[31],Max[31],ans[3005];int main()
{freopen("domine.in","r",stdin);freopen("domine.out","w",stdout);while(true){scanf("%d",&a[++cnt]);if(a[cnt]==0)break;maxn=max(maxn,a[cnt]);}Max[1]=Min[1]=1;for(int i=2;i<=30;i++){Min[i]=Min[i-1]+Min[i-2]+1;Max[i]=Max[i-1]*2+1;}ans[1]=1,ans[2]=2,f[1][1]=1;f[2][2]=2;for(int i=3;i<=maxn;i++){int h=1;while(Max[h]<i)h++;while(Min[h]<=i){int j=Min[h-2];while(true){int l=j,r=i-l-1;if(r<Min[h-2])break;f[i][h]=((((f[i][h]+(f[l][h-1]*f[r][h-2])%mod)%mod+(f[l][h-2]*f[r][h-1])%mod)%mod)+(f[l][h-1]*f[r][h-1])%mod)%mod;j++;}ans[i]=(ans[i]+f[i][h])%mod;h++;}}for(int i=1;i<=cnt-1;i++){int k=a[i];if(k>=35)printf("%.9d\n",ans[k]);else printf("%d\n",ans[k]);}return 0;
}

转载于:https://www.cnblogs.com/DexterYsw/p/7183969.html

[noip模拟赛2017.7.4]相关推荐

  1. [noip模拟赛2017.7.16]

    题目名称 黑魔法师之门 守卫者的挑战 终极武器 程序文件名 magician guard laser 输入文件名 magician.in guard.in laser.in 输出文件名 magicia ...

  2. [noip模拟赛2017.7.7]

    转自同组的一个OIer(当然是比我强的) 题目名称 小猫爬山 Freda 的传呼机 Rainbow 的信号 程序文件名 catclimb communicate signal 输入文件名 catcli ...

  3. jyzy noip模拟赛5.22-2

    不知道哪来的题 jyzy noip模拟赛5.22-2 样例输入 1 2 3 4 样例输出 0.200000000000000 数据 |a|,|b|,|c|,|d|<=1e9 很多大佬迅速想到二分 ...

  4. NOI.AC NOIP模拟赛 第六场 游记

    NOI.AC NOIP模拟赛 第六场 游记 queen 题目大意: 在一个\(n\times n(n\le10^5)\)的棋盘上,放有\(m(m\le10^5)\)个皇后,其中每一个皇后都可以向上.下 ...

  5. 【noip模拟赛4】Matrix67的派对 暴力dfs

    [noip模拟赛4]Matrix67的派对 描述 Matrix67发现身高接近的人似乎更合得来.Matrix67举办的派对共有N(1<=N<=10)个人参加,Matrix67需要把他们安排 ...

  6. 【HHHOJ】NOIP模拟赛 捌 解题报告

    点此进入比赛 得分: \(30+30+70=130\)(弱爆了) 排名: \(Rank\ 22\) \(Rating\):\(-31\) \(T1\):[HHHOJ260]「NOIP模拟赛 捌」Dig ...

  7. NOIP模拟赛csy2021/10/30

    NOIP模拟赛csy2021/10/30 比赛时间规划 赛后反思与总结 这..总的来说感觉打的很不好,根本没有状态,有一部分原因是今天来晚了,太慌,更多的还是这次题感觉很难o(╥﹏╥)o 比赛时间规划 ...

  8. 【WZOI第二次NOIP模拟赛Day1T2】世界末日 解题报告

    [WZOI第二次NOIP模拟赛Day1T2]世界末日 Problem 2 世界末日 (doomsday.pas/c/cpp) 背景 话说CWQ大牛终于打开了那扇神秘大门,但迎接他的不是什么神秘的东西, ...

  9. NOIP 模拟赛 长寿花 题解

    NOIP 模拟赛 长寿花 题解 要放 \(n\) 层物品,第 \(i\) 层有 \(a_i\) 个位置放物品,物品有 \(m\) 中颜色,有约束条件: 同一层两个相邻物品颜色不能相同. 相邻两层颜色集 ...

最新文章

  1. JetBrains 第二轮:再为免费全家桶续命三个月
  2. IntelliJ IDEA 2020.2.4款 神级超级牛逼插件推荐(自用,真的超级牛逼)
  3. IOS-组件化架构漫谈
  4. VS2013 UML 如何复制文件
  5. 学习记录-Linux内核模块查看命令
  6. 自定义 HBase-MapReduce1
  7. 迎新年\年会背景PSD分层模板
  8. HP/Aruba 2620系列交换机DHCP中继配置方法
  9. 中科院-杨力祥视频教程 02课程
  10. 结构梁配筋最牛插件_结构设计常识分享!结构抗震概念——强柱弱梁
  11. Detached InstanceError:Instance is not bound to a Session 关闭session后使用SQLAlchemy对象
  12. 网络聊天室的分析与实现
  13. SAP License:SAP反记帐和红字冲销
  14. 深度实战Electron,开发本地音乐播放器
  15. fastadmin 工具栏添加表格重置
  16. 文章如何在paperpaper查重
  17. 支付宝iOS版9.2上架:适配iPhone 6s、生活圈、阅后即焚
  18. 云和恩墨数据库一体机助力天安人寿 zData架构高效运行
  19. unity 灯光烘焙对比
  20. 英特尔 NUC 豆子峡谷 安装ubantu 的总结

热门文章

  1. STM8L低功耗设置,深坑。。。
  2. 扫码支付吃个煎饼,街边摊支付的背后也要有大数据运营
  3. 三星SDS推出企业人工智能聊天机器人Brity
  4. composer 2.0 报错:No composer.json present in the current directory, this may be the cause of the foll
  5. 广州哪个大学大一计算机学ps,紧急!广东12所“野鸡大学”名单曝光!广州人千万别上当!...
  6. 邵阳一中2021高考成绩查询,2021年邵阳高考状元名单公布,邵阳文理科状元是谁多少分...
  7. 在线考试系统(3)——学生登录实现
  8. C#正则匹配(提取字符串中的数字)及C#“四舍五入”
  9. 数据存储之归档解档 NSKeyedArchiver NSKeyedUnarchiver
  10. JAVA中word转PDF缺失表格_java – 当excel(.xlsx)使用开放式办公室转换为pdf(.pdf)时,缺少工作表和页面大小问题...