链接:http://uoj.ac/problem/52

刚刚越过绝境长城,只见天空中出现了炫目的光芒 —— 圣诞老人出现了。

元旦三侠立刻进入战斗。生蛋侠、圆蛋侠和零蛋侠分别有 na,nb,ncna,nb,nc 个激光炮。生蛋侠的激光炮的威力分别为 a0,a1,…,ana−1a0,a1,…,ana−,圆蛋侠的激光炮的威力分别为 b0,b1,…,bnb−1b0,b1,…,bnb−,零蛋侠的激光炮的威力分别为 c0,c1,…,cnc−1c0,c1,…,cnc−。

元旦三侠的激光炮的威力已经按从小到大的顺序排好序了,即 ai−≤aiai−≤ai,bi−≤bibi−≤bi,ci−≤cici−≤ci。

由于元旦三侠精力有限,他们得废弃掉 kk 个激光炮。为了更好地进行战斗,他们决定废弃掉威力前 kk 小的激光炮。

赶快帮助元旦三侠,让激光炮投入战斗吧!你只需要告诉他们威力第 kk 小的激光炮威力是多少。

任务
你需要编写一个函数 query_kth,以确定威力值第 kk 小的激光炮威力值是多少。 query_kth(n_a, n_b, n_c, k)
n_a:生蛋侠拥有的激光炮数目 nana。保证 na≥0na≥。
n_b:圆蛋侠拥有的激光炮数目 nbnb。保证 nb≥0nb≥。
n_c:零蛋侠拥有的激光炮数目 ncnc。保证 nc≥0nc≥。
kk:要查询的排名 kk。保证 ≤k≤na+nb+nc1≤k≤na+nb+nc。
你可以调用三个函数 get_a、get_b、get_c 以帮助你确定第 kk 小的激光炮。我们会根据你调用这三个函数的总次数评分。 get_a(i) 将返回 aiai。如果 ii 在 ≤i<na0≤i<na 之外,该函数将返回 。
get_b(i) 将返回 bibi。如果 ii 在 ≤i<nb0≤i<nb 之外,该函数将返回 。
get_c(i) 将返回 cici。如果 ii 在 ≤i<nc0≤i<nc 之外,该函数将返回 。
在一组测试数据中,query_kth 只会被调用一次。 实现细节
本题只支持 C/C++/Pascal。 你只能提交一个源文件实现如上所述的 query_kth 函数,并且遵循下面的命名和接口。 C/C++ 你需要包含头文件 kth.h。 int query_kth(int n_a, int n_b, int n_c, int k);
函数 get_a, get_b, get_c 的接口信息如下。 int get_a(int p);
int get_b(int p);
int get_c(int p);
Pascal 你需要使用单元 graderhelperlib。 function query_kth(n_a, n_b, n_c, k : longint) : longint;
函数 get_a, get_b, get_c 的接口信息如下。 function get_a(p : longint) : longint;
function get_b(p : longint) : longint;
function get_c(p : longint) : longint;
如果有不清楚的地方,见样例及测评库下载,内附了样例程序。 评测方式
评测系统将读入如下格式的输入数据: 第 行: na,nb,nc,kna,nb,nc,k
第 行:nana 个整数,第 ii 个整数表示 aiai。
第 行:nbnb 个整数,第 ii 个整数表示 bibi。
第 行:ncnc 个整数,第 ii 个整数表示 cici。
在 query_k 返回后,评测系统将输出你的答案以及 get_a, get_b, get_c 三个函数的总调用次数。 样例一
input output explanation 所有激光炮从小到大排序后为 ,,,,,,,,,,,,,,,所以第 小的数为 。输出的第二个整数 为总调用次数,你可以认为这是一个调用了 次 get_a, get_b, get_c 函数的程序的输出。 样例二
见样例及测评库下载。 限制与约定
共 个测试点,每个测试点 分。设你的程序 get_a, get_b, get_c 函数的调用次数为 tt。当 t≤100t≤ 时得 分,否则当 t≤2000t≤ 时得 分,否则不得分。 测试点编号 特殊限制
na,nb,nc≤30na,nb,nc≤
nc=0nc= 无 对于所有测试点,≤na,nb,nc≤≤na,nb,nc≤,≤ai,bi,ci≤≤ai,bi,ci≤。 交互式类型的题目怎么本地测试 时间限制:1s1s
空间限制:256MB

题干

第一次接触交互式的题目,挺费事的,但还挺有趣的。

思路:

  如果你一个一个读取就超时了,但如果我读每组数的第k/3个,可以保证的是最小的那一列肯定在所有数的前K小。这句话是关键。

  然后k就减小k/3,重复以上操作,直到k为零。

  注意一下细节问题就行啦。

#include<cstdlib>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<iostream>
#include<algorithm>
#include"kth.h"
using namespace std;
int query_kth(int n_a,int n_b,int n_c,int k)
{
int ca=,cb=,cc=;
int ta,tb,tc;
int minn,t;
while(k)
{
int t=max(,k/-);
ta=get_a(ca+t),tb=get_b(cb+t),tc=get_c(cc+t);
minn=min(ta,min(tb,tc));t++;
if(minn==ta) ca+=t;else if(minn==tb) cb+=t;else cc+=t;
k-=t;
}
return minn;
}

代码

#52. 【UR #4】元旦激光炮 (交互式题)的更多相关文章

  1. UOJ.52.[UR #4]元旦激光炮(交互 思路)

    题目链接 \(Description\) 交互库中有三个排好序的,长度分别为\(n_a,n_b,n_c\)的数组\(a,b,c\).你需要求出所有元素中第\(k\)小的数.你可以调用至多\(100\) ...

  2. Uoj 52. 【UR #4】元旦激光炮 神题+交互题

    Code: #include "kth.h" #include<iostream> int minn(int x,int y){return x<y?x:y;}; ...

  3. [UOJ #52]【UR #4】元旦激光炮

    题目大意:交互题,给你三个有序数组,长度分别为$n\_a,n\_b,n\_c$,都不超过$10^5$.三个函数$get\_a(i),get\_b(i),get\_c(i)$,分别返回$a_i,b_i, ...

  4. UOJ#52. 【UR #4】元旦激光炮(交互)

    题意 给出三个已经排好序的数组$a, b, c$ 在$100$次询问内找出第$k$小的元素 Sol 一种很显然的$log^2n$的做法:首先在$a$中二分,然后再$b,c$中二分.这样可以得到$60$ ...

  5. UOJ 52 元旦激光炮

    http://uoj.ac/problem/52 题意:每次可以得到3个序列中 思路:每次分别取出三个序列的K/3长度的位置,取最小的那个,然后每次减掉它,总复杂度是Nlog3N #include & ...

  6. UOJ52——【UR #4】元旦激光炮

    1.题目大意:就是给你三个数组啦,然后让你找到其中的第K大,但是,不可以直接访问数组,必须通过一种函数,最后的分数 是看调用几次这个函数,100次以内10分,2000以内6分.... 2.分析:最开始 ...

  7. 【uoj#51】[UR #4]元旦三侠的游戏 博弈论+dp

    题目描述 给出 $n$ 和 $m$ ,$m$ 次询问.每次询问给出 $a$ 和 $b$ ,两人轮流选择:将 $a$ 加一或者将 $b$ 加一,但必须保证 $a^b\le n$ ,无法操作者输,问先手是 ...

  8. ZJOI2019一轮停课刷题记录

    Preface 菜鸡HL终于狗来了他的省选停课,这次的时间很长,暂定停到一试结束,不过有机会二试的话还是可以搞到4月了 这段时间的学习就变得量大而且杂了,一般以刷薄弱的知识点和补一些新的奇怪技巧为主. ...

  9. NOI真题记录

    NOI2001 食物链,拓展域并查集. 炮兵阵地,棋盘状压DP. NOI2002 银河英雄传说,kruskal重构树/带权并查集. 贪吃的九头龙,树形DP. NOI2003 逃学的小孩,树形DP,二次 ...

随机推荐

  1. yii中调取字段名称时label与labelEx的区别

    $form = $this->beginWidget('CActiveForm',array('id' => 'userRegisterForm')); echo $form->la ...

  2. nyoj 1279 (河南省第九届ACM比赛 D 题)

    思路:变换一下坐标系新的坐标系就是给定的两条直线,变换之后求 x,y 都严格递增的点的个数的max: 求 x,y 都严格递增的点的个数的max,按照x的从小到大排序,x相同的按照y的从大到小排序然后对 ...

  3. UVA-10779(最大流)

    题意: Bob与他的朋友交换贴纸;他的这些朋友只交换自己没有的贴纸;且用的是自己所有的重复贴纸;现在要求Bob最大能得到多少张贴纸; 思路: 把人和物品都进行编号,添加原点s和汇点e,s到每个物品连边 ...

  4. 「LOJ#10015」「一本通 1.2 练习 2」扩散(并查集

    题目描述 一个点每过一个单位时间就会向 444 个方向扩散一个距离,如图所示:两个点 a .b 连通,记作 e(a,b),当且仅当 a .b的扩散区域有公共部分.连通块的定义是块内的任意两个点 u.v ...

  5. php之创建jsonp接口调数据

    jsonp跨域访问数据 首先在php内写jsonp调用接口 <?php//设置头部文件类型为json header('Content-type: application/json'); //将r ...

  6. Turn your Session into FlushMode.COMMIT/AUTO or remove 'readOnly' marker from transaction definition.

  7. 激活层和pooling的作用

    激活层: 激活函数其中一个重要的作用是加入非线性因素的,将特征映射到高维的非线性区间进行解释,解决线性模型所不能解决的问题 pooling层: 1. invariance(不变性),这种不变性包括tr ...

  8. spring boot 部署 发布

    Spring Boot应用的打包和部署 字数639 阅读2308 评论0 喜欢5 现在的IT开发,DevOps渐渐获得技术管理人员支持.云计算从ECS转向Docker容器技术.微服务的概念和讨论也越来 ...

  9. TQ210 —— S5PV210 uboot顶层Makefile分析

    转自:http://blog.csdn.net/wqx521/article/details/52469759 # (C) Copyright 2000-2008 # Wolfgang Denk, D ...

  10. Android 常用adb shell 命令(转)

    调试Android程序有时需要adb shell 命令,adb全称Android Debug Bridge ,就是起到调试桥的作用. 通过adb我们可以在Eclipse中通过DDMS来调试Androi ...