Acdream 1205 Disappeared Block(模拟)
2015-07-01 10:07
453 查看
题目链接:传送门
题意:
有n个高度分别为hi的山峰,然后海平面,初始的时候为0,然后每隔一秒还平面会上升一米
然后给定m个时刻,求第i秒时这时候的山峰分成了几块初始的时候都连在一起很明显是一块。
分析:
我们将海面看着是不动的,然后将时间倒着来考虑,考虑山峰是逐渐上升的,然后如果它的
在这个某时刻之前如果它的左右的山峰都没有出现的话那么块数就要增加,否则如果左右都
出现了的话那么块数就要减一。
代码如下:
题意:
有n个高度分别为hi的山峰,然后海平面,初始的时候为0,然后每隔一秒还平面会上升一米
然后给定m个时刻,求第i秒时这时候的山峰分成了几块初始的时候都连在一起很明显是一块。
分析:
我们将海面看着是不动的,然后将时间倒着来考虑,考虑山峰是逐渐上升的,然后如果它的
在这个某时刻之前如果它的左右的山峰都没有出现的话那么块数就要增加,否则如果左右都
出现了的话那么块数就要减一。
代码如下:
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int maxn = 1e6+10; struct nod{ int id,h; bool operator <(const struct nod &tmp)const{ return h>tmp.h; } }p[maxn]; int s[maxn]; int ans[maxn]; bool vis[maxn]; int main() { int t,n,m,cas=1; scanf("%d",&t); while(t--){ scanf("%d%d",&n,&m); for(int i=0;i<n;i++){ scanf("%d",&p[i].h); p[i].id=i; } for(int i=0;i<m;i++){ scanf("%d",&s[i]); } sort(p,p+n); memset(vis,0,sizeof(vis)); int i,j,high=0; for(i=m-1,j=0;i>=0;i--){ for(;j<n&&s[i]<p[j].h;j++){ vis[p[j].id]=1; if((p[j].id==0||!vis[p[j].id-1])&&(p[j].id==n-1||!vis[p[j].id+1]))//左右两边都没有露数来 high++; else if((p[j].id>0&&vis[p[j].id-1])&&(p[j].id<n-1&&vis[p[j].id+1])) high--; } ans[i]=high; } printf("Case #%d: ",cas++); for(int i=0;i<m;i++){ if(i==m-1) printf("%d\n",ans[i]); else printf("%d ",ans[i]); } } return 0; }
相关文章推荐
- android 单行gridview横向滑动的实现
- Android之使用PackageManager取得程序的包名、图标等
- android 中国通信乱码问题
- Android数据库高手秘籍:SQLite命令
- Objective-C基础内容简单介绍
- iOS 开发学习41 提交appstore
- unity 线程下载图片
- iOS第三方支付-微信支付
- Android中应用程序如何获得系统签名权限
- cisco 交换机恢复IOS与更改波特率
- 使用Xcode和Instruments调试解决iOS内存泄露
- Android布局管理器
- Xcode —— waiting for (app's name) to launch 模拟器开不了
- Android SDK Manager更新
- ios支付宝支付开发
- Android Studio把library分发到jCenter和Maven Central
- android 客户端版本检测更新,服务下载,通知栏显示
- Android关键字模糊查询,并带有高亮效果
- GitHub排名前50的Objective-C开发者
- ios程序启动原理(UIApplication)