TYVJ4623 球球大作战·生存

时间: 500ms / 空间: 65536KiB / Java类名: Main

背景

小天很喜欢玩球球大作战这个游戏,大家也应该都玩过。游戏规则是:移动自己的球,移动到别人的球(一定要比自己的球小)的位置上,就可以吃掉别人的球,把别人的球的体积值加到自己的球上。还有分身、吐球等功能,但本题不考虑。

描述

作为一个OIer,小天给自己做了一个超牛的外挂:让自己的球瞬间移动到场内的任何位置!!!这意味着小天可以瞬间移动到任何一个比自己小的球上,把它吃掉。现在,小天只用外挂来瞬移,每次瞬移只能吃掉一个球。

现在房间内有n个大小不一的球,小天至少瞬移吃球多少次,才能比剩下的所有球都大呢?

样例1:

输入

3 5

10 7 4

输出

2

样例2:

输入3 5

12 2 4

输出

-1

11

输入格式

第一行两个正整数n,s,分别表示场内别人球的个数、小天的球的初始大小。

第二行n个正整数,表示这些球各自的大小。

输出格式

一行一个整数,表示变成第一至少需要吃人的次数。如果怎么也无法变成第一,则输出两行,第一行为-1,第二行为最大能达到的体积值。

备注

数据限制:

n<=30000

其他数字保证32位能存下

解法一:优先队列。10个点总用时45ms

每次把小于当前体积的数压进优先队列(大根堆),每次贪心取堆顶元素吃掉,记录何时成为最大球。

 1 /*by SilverN*/
 2 #include<algorithm>
 3 #include<iostream>
 4 #include<cstring>
 5 #include<cstdio>
 6 #include<cmath>
 7 #include<queue>
 8 using namespace std;
 9 const int mxn=30010;
10 int read(){
11     int x=0,f=1;char ch=getchar();
12     while(ch<‘0‘ || ch>‘9‘){if(ch==‘-‘)f=-1;ch=getchar();}
13     while(ch>=‘0‘ && ch<=‘9‘){x=x*10+ch-‘0‘;ch=getchar();}
14     return x*f;
15 }
16 int a[mxn];
17 int n;
18 priority_queue <int,vector<int>,less<int> >q;
19 int pos,s=0;
20 int main(){
21     n=read();s=read();
22     int i,j;
23     for(i=1;i<=n;i++) a[i]=read();
24     sort(a+1,a+n+1);
25     pos=1;bool flag=0;
26     int cnt=0;
27     while(++cnt){
28         while(a[pos]<s && pos<=n){q.push(a[pos]);pos++;}
29         if(pos>n && !flag){
30             flag=1;printf("%d\n",cnt-1);
31         }
32         if(q.empty())break;
33         s+=q.top();q.pop();
34     }
35     if(!flag)printf("-1\n%d\n",s);
36     return 0;
37 }

优先队列

解法二:暴力二分查找。 10个点总用时638ms

将所有数排序,每次二分查找当前能吃掉的最大球,如果这个球之前已经被吃掉了,就从此处向前暴力找第一个没被吃掉的球来吃。

 1 /*by SilverN*/
 2 #include<algorithm>
 3 #include<iostream>
 4 #include<cstring>
 5 #include<cstdio>
 6 #include<cmath>
 7 using namespace std;
 8 const int mxn=30010;
 9 int read(){
10     int x=0,f=1;char ch=getchar();
11     while(ch<‘0‘ || ch>‘9‘){if(ch==‘-‘)f=-1;ch=getchar();}
12     while(ch>=‘0‘ && ch<=‘9‘){x=x*10+ch-‘0‘;ch=getchar();}
13     return x*f;
14 }
15 int a[mxn];
16 int smm=0,mx=0;
17 int n,s;
18 bool vis[mxn];
19 int main(){
20     n=read();
21     s=read();
22     int i,j;
23     for(i=1;i<=n;i++){
24         a[i]=read();
25         smm+=a[i];
26     }
27     sort(a+1,a+n+1);
28     mx=a[n];
29     int cnt=0;
30     int ans=0;
31     bool flag=0;
32     int pos=0;
33     for(i=1;i<=n;i++){
34         int l=1,r=n;
35         int mid;
36         while(l<=r){
37             mid=(l+r)>>1;
38             if(s<=a[mid]){
39                 r=mid-1;
40             }
41             else{
42                 pos=mid;
43                 l=mid+1;
44             }
45         }
46         l=pos;
47         while(vis[l])l--;
48         s+=a[l];
49         cnt++;
50         if(l)vis[l]=1;
51         if(s>mx && !flag){
52             flag=1;
53             ans=cnt;
54         }
55     }
56     if(ans==0)printf("-1\n%d\n",s);
57     else printf("%d\n",ans);
58     return 0;
59 }

二分+暴力

暴力多吼呀!

时间: 2024-11-05 13:46:42

TYVJ4623 球球大作战·生存的相关文章

websocket实现简化版球球大作战

websocket是一种全新的网络协议(虽然就我接触编程的时间点来说不算新了),在服务器端和客户端频繁通信时,相较与ajax轻便很多,球球大作战这个小项目如果在网页上实现,必然使用websocket而非ajax. 由于是个小游戏,所以,我也没用上什么框架或者数据库,服务器端用nodejs构建,客户端就用js写. 接下来写写项目中遇到的一些需求难题以及解决方案.(姑且将我写出错误的地方叫做难题吧) 1.如何将所有用户的小球都展现在每一个客户端的画面上? 每一个用户参与游戏后,都用构造函数生成一个小

当我阅读完上千行的游戏球球大作战战斗服务器端源码后...

这周服务器主程安排给了我一个任务(其实是我在用Go做完了一些小demo后,向主程请示下一步的安排),让我将他用Lua语言写的球球大作战的服务端代码转成Go语言形式. 于是,我开搞了! 此内容以上传至github,感兴趣的可以看一下github地址 框架主要分以下几个部分 1,sever-client部分 因为要有主入口,所以要新增一个server文件,client文件用来测试服务器端.而服务器又分以下几类: 与客户端的连接 选择进入的房间 进入房间后玩家数据的收发 战斗中的数据变化 2,玩家和A

球球大作战

球球大作战 http://acm.hdu.edu.cn/contests/contest_showproblem.php?cid=831&pid=1003 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 0    Accepted Submission(s): 0 Problem Description 小Z最近迷上了球球大作战,他准备出

球球大作战四亿人都在玩?玩家回归没有优越感,新玩家游戏被虐,游戏体验感极差!

球球大作战,这是一款很火的手游,自己曾经玩了3年的游戏,如今已经厌倦了,所以退游了. 当时任然记得猎魔模式,感觉身边都是人,这游戏身边都有人在玩.后面嘛,由于游戏氛围不太好,合作的人太多,一个人单排这种简直没法玩了,自然卸了. 当初为了棒棒糖,可以没日没夜的玩,可以说是'不择手段',好不容易攒够了棒棒糖,买了一个光环,虽然是比较廉价的,当时自己还是很激动,很开心的,也很心满意足的.当时球球大作战这一款游戏还是很良心的,没有像今天这么多的充值活动,现在的球球大作战怎么感觉越来越向腾讯游戏靠拢了?

球球大作战 01 小球的移动和碰到金币,金币会消失。

版权申明: 本文原创首发于以下网站: 博客园『优梦创客』的空间:https://www.cnblogs.com/raymondking123 优梦创客的官方博客:https://91make.top 优梦创客的游戏讲堂:https://91make.ke.qq.com 『优梦创客』的微信公众号:umaketop 您可以自由转载,但必须加入完整的版权声明! 球球大作战小球的移动和碰到金币,金币会消失. 吃到金币 public class SphereMove : MonoBehaviour { p

【204】显示3D大球球

1. 光滑球 From Jan 28, 2016 2. 大球球 https://www.revolvermaps.com/?target=enlarge&i=0xoqkxnu52c&dm=8

贪吃蛇大作战的一点感悟

春节过罢,闲来无事,玩了两日贪吃蛇大作战,之前玩过球球大作战,感觉球球大作战玩法比较多,也比较难入门.而贪吃蛇大作战就简单多了,就两个原则:1不断地吃食物,让自己长大.2尽量避免撞到别人身上,以致于死亡.抱着这样的原则,我就开始了自己的贪吃之路. 刚开始的时候是小心翼翼地吃游戏自带的豆豆,也不敢去击杀别人,还经常撞到别人身上,所以更加小心地玩,自己长大了才敢去围追堵截别人,这样不知不觉居然就能玩到9000多长度了.接着再玩下去就有点心急了,一方面是有前边的经验,感觉也不太难嘛,另一方面想更快地打

刺猬大作战(游戏引擎用Free Pascal写成,GUI用C++写成,使用SDL和Qt4)

游戏特性[编辑] 游戏引擎用Free Pascal写成,GUI用C++写成,使用SDL和Qt4[2]. 0.9.12开始支持实时动态缩放游戏画面. 个性化[编辑] 刺猬大作战有着高度定制性 游戏模式:游戏方式可以发生很大变化,比如棒球模式中,所有刺猬都有保护膜无法损伤,只能击入水中退场 可以制作语音,游戏已经包括如海盗,唱诗风格等五种风格,使用开放的ogg格式 纸娃娃系统,不只可以为每个队员命名,还可以用头饰分辨每个人,已有超过90种头部装饰分辨每个刺猬 支持定制团队背景和离场的动画效果 武器[

cocos2d-x 3.2 之 三消类游戏——万圣大作战

***************************************转载请注明出处:http://blog.csdn.net/lttree******************************************** 首先祝大家万圣节快乐呀~ 紧赶慢赶,第二款cocos2d-x游戏终于出来了. 万圣大作战 三消类的游戏 下面是游戏的一些截图~ 主界面 设置界面: 游戏界面: 结束界面:         和第一款2048相比, 多了 分数的本地存储(未加密) 音乐和音效的 设置