hdu1025 Constructing Roads In JGShining's Kingdom

来源:互联网 发布:王者荣耀网络延迟460 编辑:程序博客网 时间:2024/05/16 16:28

最大上升子序列LIS 思路就是开一个栈,每次取栈顶元素top和读到的元素temp做比较,如果temp > top 则将temp入栈;如果temp < top则二分查找栈中的比temp大的第1个数,并用temp替换它。 最长序列长度即为栈的大小top。

题目好难懂,懂了之后也没想到这是一个LIS的题目,注意输出的细节,wrong了n遍

输出,注意一条多条的不同输出,样例之间打印空行

2、题目大意

有2n个城市,其中有n个富有的城市,n个贫穷的城市,其中富有的城市只在一种资源富有,且富有的城市之间富有的资源都不相同,贫穷的城市只有一种资源贫穷,且各不相同,现在给出一部分贫穷城市的需求,每个需求都是一个贫穷的向一个富有的城市要资源,且每个富有的城市都想向贫穷的城市输入自己富有的那部分资源,现在为了运输要建设多条路,但是路与路之间不允许有交叉,求满足贫穷城市的各种要求最多可以建设多少条路

3、解题思路:

将贫穷的城市按从小到大的顺序排列,然后求富有的城市序号的最大上升子序列LIS解决即可

#include<iostream>#include<stdio.h>#include<math.h>#include<algorithm>#include<string.h>using namespace std;int stack[1000005];int st[1000005];int n;int main(){int a,b,i,j;int le,ri;int t=1;while(scanf("%d",&n)!=EOF){//printf("nn=%d\n",n);//memset(stack,0,sizeof(stack));//memset(st,0,sizeof(st));for(i=1;i<=n;i++){scanf("%d%d",&a,&b);st[a]=b;}int ans=1;stack[1]=st[1];//printf("ss\b\n");for(i=2;i<=n;i++){if(stack[ans]<st[i]){ans++;stack[ans]=st[i];}else{le=1;ri=ans;while(le<=ri){int mid=(le+ri)/2;if(stack[mid]<=st[i])le=mid+1;elseri=mid-1;}stack[le]=st[i];if(le>ans)ans++;}}printf("Case %d:\n",t++);if(ans==1)printf("My king, at most %d road can be built.\n\n",ans);elseprintf("My king, at most %d roads can be built.\n\n",ans);}return 0;}


0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 社区医保本丢了怎么办 宝宝医保卡掉了怎么办 同煤医疗卡丢了怎么办 杭州医保卡丢了怎么办 新的医保卡丢了怎么办 二代医保卡丢了怎么办 老医保卡丢了怎么办 上海医保卡余额用完了怎么办 身份证丢了医疗报销怎么办 取公积金身份证丢了怎么办 身份证丢了怎么办就诊卡 人在外地怎么办农村社保卡 武汉医保卡丢了怎么办 济宁社保卡丢了怎么办 农村医疗本丢了怎么办 常熟医保卡丢了怎么办 农民社保卡丢了怎么办 常熟社保卡坏了怎么办 社保卡丢失补办期看病怎么办 社保卡补办期间看病怎么办 医保卡冻结了出院结算怎么办 住院医保卡钱不够怎么办 住院押金条丢了怎么办 急用新社保卡要怎么办 看病没带社保卡怎么办 医保卡掉了住院怎么办 厦门医保卡丢了怎么办 成都医保卡丢了怎么办 长春医保卡丢了怎么办 县城医保卡丢了怎么办 医保卡丢了怎么办南宁 西安职工医保丢了怎么办 重庆医保卡丢了怎么办 外地医保卡丢了怎么办 换单位后医保卡怎么办 单位没交失业金怎么办 沈阳医保卡密码忘了怎么办 西安网约车资格证怎么办 红跑车卡丢了怎么办 苏州住房公积金密码忘了怎么办 公积金查询密码忘记了怎么办