HDU 5360 Hiking
2015-08-06 17:37
302 查看
HDU 5360 Hiking
依照我看来这道题是一道动态规划的题
当我们邀请a个人后我们可以将所有下限小于等于a的人都放到我们的候选范畴中,然后从这些候选的人中选出上限大于等于a的且上限最小的人邀请,之后对a进行自增操作
持续下去得出最终结果
做题的时候用优先级队列优化的
依照我看来这道题是一道动态规划的题
当我们邀请a个人后我们可以将所有下限小于等于a的人都放到我们的候选范畴中,然后从这些候选的人中选出上限大于等于a的且上限最小的人邀请,之后对a进行自增操作
持续下去得出最终结果
做题的时候用优先级队列优化的
#include<algorithm> #include<iostream> #include<cstring> #include<cstdio> #include<vector> #include<queue> #define ll __int64 #define INF 1e9 #define maxn 100005 using namespace std; struct node{ int down,up; int i; }p[maxn]; bool operator <(node a,node b){ return a.up>b.up; } bool cmp(node a,node b){ return a.down<b.down; } bool cmp1(node a,node b){ return a.i<b.i; } int ans[maxn]; int main(){ int T; scanf("%d",&T); while(T--){ int n; scanf("%d",&n); for(int i=0; i<n;i++) scanf("%d",&p[i].down); for(int i=0; i<n;i++) scanf("%d",&p[i].up); for(int i=0; i<n;i++) p[i].i=i+1; sort(p,p+n,cmp); priority_queue<node> Q; int k=0; for(k=0;k<n;k++){ if(p[k].down==0) Q.push(p[k]); else break; } int A=0,B=n-1; while(!Q.empty()){ node temp=Q.top(); Q.pop(); if(temp.up>=A){ ans[A++]=temp.i; for(;k<n;k++) if(p[k].down<=A) Q.push(p[k]); else break; } else{ ans[B--]=temp.i; } } for(;k<n;k++) ans[B--]=p[k].i; printf("%d\n",A); for(int i=0;i<n;i++){ if(i==0) printf("%d",ans[i]); else printf(" %d",ans[i]); } printf("\n"); } return 0; }
相关文章推荐
- nsdictionary ,nsarray 和 json 字符串 的转换
- mongodb初学-常用基本命令
- html = data.decode('gbk').encode('utf-8')
- Leetcode解题思想总结篇:双指针
- java.util.logging.Logger使用详解
- 使用js模拟ecshop元素挪移
- BDFeatureMatch_yalmip_vlfeat
- Android中HandlerThread的使用及源码解析
- android Intent
- 基于CXF webservice (2)
- FragmentTransaction实现Fragment转换
- Redis介绍及常用命令
- 黑马程序员--Java面向对象
- openstack官方docker介绍
- 杂说
- Murano Service Architecture Introducation
- jQuery动态星级评分效果实现方法
- Linux crontab 命令格式与详细例子
- Leetcode 201 Bitwise AND of Numbers Range 区间内整数按位与
- CALayer