2012百度之星初赛第一场题A度度熊就是要第一个出场
来源:互联网 发布:u盘禁止写入软件 编辑:程序博客网 时间:2024/04/28 15:32
第一题:度度熊就是要第一个出场
贴图不方便, 完整题目见这里
我的思路:
1,从下向上,找第一名的路径,把横线段做标记1,没有横线段的地方添加横线段出来,标记2
2,从上向下,找第K名(即度度熊的位置)的路径,遇到有标记的即表示本身就是第一(标记1),或加线段后可以是第一(标记2)
代码如下, 测试用例可以通过, 又做了几个简单的测试
// 2012 百度之星 初赛 第一场 题A:度度熊就是要第一个出场#include <iostream>#include <vector>#include <algorithm>using namespace std;typedef struct line{ int elem1; int elem2; int elem3; int path;}line;//升序排序,是"<",降序排列是">"号bool cmp(line a,line b){ return a.elem3<b.elem3;}int main(){ int loop;cin>>loop;while (loop--){int i,j,tag=0,N,M,K,max3=0,noline=0;//员工数,线段树,度度熊的位置cin>>N>>M>>K;int tmpK = K;vector<line> array;//M条线段line lin;for(i=0;i<M;i++){cin>>lin.elem1>>lin.elem2>>lin.elem3;lin.path = 0;array.push_back(lin);}//按线段高低降序排列按线段高低降序排列sort(array.begin(),array.end(),cmp);//从下向上,找第一名的路线,线段path标记为1int firstpath = 1;int preelem3;preelem3 = 0;for (i=0;i<M;i++){max3 = max3>array[i].elem3?max3:array[i].elem3;if (array[i].elem1==firstpath||array[i].elem2==firstpath){noline++;//与上一个高度差if(array[i].elem3>preelem3+1){for (j=array[i].elem3-1;j>preelem3;j--){lin.elem1 = firstpath;lin.elem2 = firstpath+1;lin.elem3 = j;lin.path = 2;array.push_back(lin);//往右添加横线lin.elem1 = firstpath-1;lin.elem2 = firstpath;array.push_back(lin);//往左添加横线}}//主轴移动到旁边一个轴上firstpath = array[i].elem1==firstpath?array[i].elem2:array[i].elem1;array[i].path = 1;preelem3 = array[i].elem3;}}if (noline==0){for (j=0;j<max3+1;j++){lin.elem1 = 1;lin.elem2 = 2;lin.elem3 = j;lin.path = 2;array.push_back(lin);//往右添加横线}}//在主轴最大值上向左右加横线for (i=preelem3+1;i<=max3+1;i++){lin.elem1 = firstpath;lin.elem2 = firstpath+1;lin.elem3 = i;lin.path = 2;array.push_back(lin);//往右添加横线lin.elem1 = firstpath-1;lin.elem2 = firstpath;array.push_back(lin);//往左添加横线}//稳定排序,使固有线段在后加线段之前stable_sort(array.begin(),array.end(),cmp);//从上向下,找度度熊的路线,看能否遇到有标记的线段preelem3 = 1000000;for (i=array.size()-1;i>=0;i--){if ( (array[i].elem2!=preelem3)&&(array[i].elem1==tmpK||array[i].elem2==tmpK) ){if (array[i].path>0)//线段标有1,表示度度熊本身就是第一; 是2表示可以通过加一个线段变为第一{tag++;}tmpK=array[i].elem1==tmpK?array[i].elem2:array[i].elem1;preelem3 = array[i].elem3;}}if (tag>0) //tag>0表示可以通过加线段改为第一,tag的值表示可添加线段的位置的个数{cout<<"Yes"<<endl;}else{cout<<"No"<<endl;}} system("pause"); return 0;}
- 2012百度之星初赛第一场题A度度熊就是要第一个出场
- 【2012百度之星/初赛上】A:度度熊就是要第一个出场
- 百度之星2012初赛Day1 A - 度度熊就是要第一个出场
- 【2012百度之星/初赛下】A:度度熊就是要刷排名第一
- 2012百度之星初赛第一场
- 2012百度之星初赛第一场B题
- 算法题<度度熊就是要第一个出场>
- 百度之星2015初赛第一场
- BZOJ2844 albus就是要第一个出场
- bzoj2844 albus就是要第一个出场
- 2844: albus就是要第一个出场
- 趣题1:度度熊就是要第一个出场
- 2012百度之星初赛第一场题B小小度刷礼品
- 百度之星2016初赛第一场(Astar Round 2A)
- 2008百度之星第一场初赛题目
- 百度之星2009程序设计大赛 初赛第一场试题
- 2014百度之星初赛第一场部分题解
- 百度之星第一场初赛部分题解
- 音乐应用(App)用户和市场分析
- gcc中的参数-I -L -l三者的区别
- 一、SVN服务器的搭建和基础配置——windows服务器篇
- 线程的协调工作
- Android学习记录第一篇
- 2012百度之星初赛第一场题A度度熊就是要第一个出场
- 如何更改服务器用户名和密码
- Apple App Store 音乐App 美国畅销榜单前30名使用记录
- 设置Button的显示内容/使按钮变得不可用
- 键盘钩子
- linux下文件传输程序
- c++初学-不只是 爱好
- spring-mvc 详解
- C#入门经典学习8-面向对象