应该一眼看出来是贪心题,然后想最优解是什么。正确的贪心策略是【原棋盘上每个位置的棋子】都往最近的左边【目标棋盘上棋子】移动,如果左边没有棋子了那就闲置最后处理,如果目标棋盘在该位置上也有棋子,那就算距离为0(最近)。最后处理的话,棋盘上的局面应该是所有的棋子都得往右移,这样的话怎么移都无所谓了,朴素的把放过去。

模拟的时候难度在于通过upper bound找到离该位置最近左的位置,所以复杂度是O(NlogN);如果朴素的遍历数组找最近左需要N复杂度,整体n^2就过不了了。

对于upper_bound来说,返回的是被查序列中第一个大于查找值的指针,也就是返回指向被查值>查找值的最小指针,lower_bound则是返回的是被查序列中第一个大于等于查找值的指针,也就是返回指向被查值>=查找值的最小指针。 【引用自 https://blog.csdn.net/u011008379/article/details/50725670 】

 1 #include<iostream>
 2 #include<algorithm>
 3 #include<map>
 4 #include<vector>
 5 using namespace std;
 6
 7 int board[100005];
 8 vector<int> va;
 9 map<int,int> m;
10 long long ans;
11 //贪心策略
12 //每个都向自己最近的左边的棋子移动
13 int main(){
14     int n; cin>>n;
15     for(int i=1;i<=n;i++) cin>>board[i];
16     for(int i=1;i<=n;i++){
17         int x; cin>>x;
18         if(x){//这个位置上有棋子
19             va.push_back(i);
20             m[i]=x;
21         }
22     }
23
24     for(int i=1;i<=n;i++){
25         while(1){
26             vector<int>::iterator index = upper_bound(va.begin(),va.end(),i);/* index指向第一个大于i的元素 */
27             //如果没有比i还大的,返回begin()
28             if(index==va.begin()) break;//目标盘左边没有棋子了
29             index--;
30             if( m[ *index ]>board[i] ) {
31                 ans+=(i-(*index) )*board[i];
32                 m[*index]-=board[i];
33                 board[i]=0;
34                 break;
35             }
36             if( m[ *index ]==board[i] ){
37                 ans+=(i-(*index))*board[i];
38                 va.erase(index);
39                 board[i]=0;
40                 break;
41             }
42             if( m[ *index]<board[i]){
43                 ans+=(i-(*index))*m[ *index];
44                 va.erase(index);
45                 board[i]-=m[*index];
46             }
47         }
48     }
49
50     for(int i=1;i<=n;i++){
51         if(board[i]==0) continue;
52         while(1){
53             if( m[ va[0] ]>board[i] ) {
54                 ans+=(i+va[0]-2)*board[i];
55                 m[ va[0] ]-=board[i];
56                 break;
57             }
58             if( m[ va[0] ]== board[i] ){
59                 ans+=(i+va[0]-2)*board[i];
60                 va.erase(va.begin());
61                 break;
62             }
63             if( m[ va[0] ]<board[i]){
64                 ans+=(i+va[0]-2)*m[ va[0] ];
65                 va.erase(va.begin());
66                 board[i]-=m[ va[0] ];
67             }
68         }
69     }
70
71     cout<<ans<<endl;
72
73     return 0;
74 }

没有提交在美团的oj上,但自己编了几个数据都过了。

转载于:https://www.cnblogs.com/ZhenghangHu/p/9162910.html

2018美团CodeM编程大赛 Round A Problem 2 下棋 【贪心】相关推荐

  1. 2018美团CodeM编程大赛资格赛第一题

    一.问题描述 题目描述 美团在吃喝玩乐等很多方面都给大家提供了便利.最近又增加了一项新业务:小象生鲜.这是新零售超市,你既可以在线下超市门店选购生鲜食品,也可以在手机App上下单,最快30分钟就配送到 ...

  2. 牛客网-2018 美团 CodeM 编程大赛-初赛 A 轮

    ACM模版 这场比赛没有晋级,以为没有好好打--我又在找借口.下午去办入职体检,比赛开始时还在回来路上,回到宿舍的时候就剩下半个小时了,签了一下到就没时间了.赛后发现第三题很有意思,就补了补-- 1- ...

  3. 一周竞赛资讯|CodeM 2018美团点评编程大赛启动

     (本内容转载自公众号"科技与Python") 如今,小程序小游戏已经成为继手游之后,中小游戏企业公认的下一个风口.CodeM是由美团点评主办的编程竞赛,旨在展示和激发软件技术人才 ...

  4. 美团点评CodeM编程大赛-题二

    美团点评CodeM编程大赛-题二 题目描述 组委会正在为美团点评CodeM大赛的决赛设计新赛制. 比赛有 n 个人参加(其中 n 为2的幂),每个参赛者根据资格赛和预赛.复赛的成绩,会有不同的积分.比 ...

  5. 看看谁获得了CodeM编程大赛的10万奖金

    7月27日,美团点评举办的CodeM编程大赛落幕.经过此前的激烈角逐,来自北京大学的吉如一同学夺得本次大赛冠军,获得单人现金税后10万元大奖. 美团点评高级副总裁穆荣均在CodeM颁奖现场表示,美团点 ...

  6. 2018美团codeM资格赛——python代码

    2018美团codeM资格赛--python代码 第一题:下单 题目描述 美团在吃喝玩乐等很多方面都给大家提供了便利.最近又增加了一项新业务:小象生鲜.这是新零售超市,你既可以在线下超市门店选购生鲜食 ...

  7. 2018美团CodeM 题解

    2018美团CodeM 题解 我现场打了3题,看看稳进复赛,就不打了. T1 这题很简单,先扫一趟刷出最大值,标记最大值出现的时候,然后在扫一遍输出答案,这样效率高. 代码如下: #include&l ...

  8. iTutorGroup学员获2018全国青少年创意编程大赛一等奖

    11月26日,2018年全国青少年创意编程与智能设计大赛闭幕式暨颁奖典礼在北京举行,来自全国的300余名青少年编程选手和科技教师.教育专家汇聚一堂,见证最终评选结果揭晓,总计数百位青少年选手获得各分类 ...

  9. CodeM美团点评编程大赛初赛A轮 B.合并回文子串【区间Dp】

    [编程题] 合并回文子串 时间限制:2秒 空间限制:262144K 输入两个字符串A和B,合并成一个串C,属于A和B的字符在C中顺序保持不变.如"abc"和"xyz&qu ...

最新文章

  1. 全球通信云市场爆发增长,RTC 技术普惠还有多远
  2. 可穿戴的脑机接口设备将运动意念转化为行动
  3. cpu和显卡瓶颈测试软件,《怪物猎人:世界》CPU测试:4核成瓶颈、6核才够用
  4. MCtalk 创业声音丨辉禹科技合伙人孔杰:投资和创业都是思维的放大器
  5. 微软想将新版Edge浏览器引入Linux
  6. SuperAgent 中文乱码星号问号问题
  7. 中raise抛出异常_Ruby 异常
  8. jsp九大内置对象和四种属性范围介绍
  9. ASP.NET核心之路微服务第03部分:Identity
  10. linux 云主机安装方法,虚拟主机linux服务器安装教程
  11. python对象回收_python 引用,拷贝,对象回收,弱引用
  12. python壁纸数据抓取_Python《wallhaven壁纸爬取》
  13. 去哪儿 Api 自动化测试实践
  14. ​​​​​​​sokit v1.3抓手机应用socket数据包: Socket是传输控制层协议,WebSocket是应用层协议。
  15. CSS命名规范--BEM
  16. 3d效果图制作傻瓜软件_装修房子自己做3D效果图,哪些3D室内设计软件比较合适?...
  17. java 依赖倒置_Java设计原则—依赖倒置原则(转)
  18. Douyu0.6.1 源码分析 之 MVC篇
  19. 手机日历怎么备注农历生日提醒
  20. python麦克劳林级数展开

热门文章

  1. truncate 、delete与drop区别
  2. ASPNET5的依赖注入
  3. java 泛型的几点备忘
  4. 数字模拟信号 单双信道传输
  5. Eclipse 插件开发 向导
  6. Angular 5.0 学习2:Angular 5.0 开发环境的搭建和新建第一个ng5项目
  7. 【无删减】Python老司机收藏夹的17个国外免费学习网站
  8. 【公告】社区周刊即日起停刊
  9. spring集成struts2
  10. android thread实例