题目大意:

输入n,k,代表n列航班,初始始发实践为1,2,3分钟以此类推,然后输入n个整数分别代表延迟1分钟第i个航班损失多少钱,然后调整后的始发时间表是这样的,任何一辆航班的始发时间不能在他的初始始发实践之前而且满足k+1<=ti<=k+n,然后,让你输出最小的损失以及一次输出每辆航班的始发时间;

基本思路:

一开始我的思路是肯定是让每分钟损失最多的放在前面,然后由于还有限制条件所以,如果当前位置(时间)不能满足,那就向后找位置,但是这样是对于一个航班找时间,时间复杂度是n^2的,果断超时;

后来参考了同学代码,是对于一个时间,用一个优先队列处理能放在当前时间的拥有每分钟最大损失的航班,这样只需要n*logn的复杂度,涨思路;

反思与总结:

其实仔细想想,就是一个萝卜一个坑,萝卜和坑的个数都是一定的,到底是拿着萝卜去找坑,还是挖坑去埋哪一个萝卜,在限制条件不同的时候,会有不同的时间复杂度;

代码如下:

(超时代码)

  1. #include<bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. #define rep(a,b,c) for(int (a)=(b);(a)<=(c);(a++))
  6. #define drep(a,b,c) for(int (a)=(b);(a)>=(c);(a--))
  7. #define mst(ans,false) memset(ans,0,sizeof(ans))
  8. #define mkp make_pair
  9.  
  10. typedef long long int ll;
  11. typedef long double lb;
  12. typedef pair<int,int> pii;
  13. const int dx[]={-,,,};
  14. const int dy[]={,-,,};
  15.  
  16. const int maxn = +;
  17. struct Node
  18. {
  19. int id,val;
  20. bool operator<(const Node& a)const
  21. {
  22. if(val==a.val) return id<a.id;
  23. return val>a.val;
  24. }
  25. }node[maxn];
  26. int vis[maxn*];
  27. int idx[maxn];
  28. int n,k;
  29. int main()
  30. {
  31. while(scanf("%d%d",&n,&k)==)
  32. {
  33. for(int i=;i<=n;i++)
  34. {
  35. scanf("%d",&node[i].val);
  36. node[i].id=i;
  37. }
  38. sort(node+,node+n+);
  39. int t=k+n;
  40. for(int i=k+;i<=k+n;i++) vis[i]=;
  41. int pos=k+;
  42. ll sum=;
  43. for(int i=;i<=n;i++)
  44. {
  45. int tt=node[i].id;
  46. if(tt>=pos)
  47. {
  48. for(int j=tt;j<=t;j++)
  49. {
  50. if(vis[j]!=) continue;
  51. vis[j]=;
  52. idx[node[i].id]=j;
  53. sum+=(j-node[i].id)*node[i].val;
  54. break;
  55. }
  56.  
  57. }
  58. else
  59. {
  60.  
  61. for(int j=pos;j<=t;j++)
  62. {
  63. if(vis[j]!=) continue;
  64. vis[j]=;
  65. idx[node[i].id]=j;
  66. sum+=(j-node[i].id)*node[i].val;
  67. break;
  68. }
  69. }
  70. }
  71. printf("%I64d\n",sum);
  72. printf("%d",idx[]);
  73. for(int i=;i<=n;i++) printf(" %d",idx[i]);
  74. printf("\n");
  75. }
  76. return ;
  77. }

(ac代码)

  1. #include<bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. const int maxn = +;
  6. typedef long long ll;
  7.  
  8. int ans[maxn];
  9. struct Node
  10. {
  11. ll x;
  12. int id;
  13. bool operator<(const Node& a)const {return x<a.x;}
  14. }node[maxn];
  15. priority_queue<Node>pq;
  16.  
  17. int main()
  18. {
  19. int n,k;
  20. ll sum;
  21. while(scanf("%d%d",&n,&k)==)
  22. {
  23. sum=;
  24. while(!pq.empty()) pq.pop();
  25. for(int i=;i<=n;i++)
  26. {
  27. scanf("%I64d",&node[i].x);
  28. node[i].id=i;
  29. if(i<=k) pq.push(node[i]);
  30. }
  31. for(int i=k+;i<=n;i++)
  32. {
  33. pq.push(node[i]);
  34. Node t=pq.top();
  35. pq.pop();
  36. sum+=(i-t.id)*t.x;
  37. ans[t.id]=i;
  38. }
  39. for(int i=;i<=k;i++)
  40. {
  41. Node t=pq.top();
  42. pq.pop();
  43. sum+=(i+n-t.id)*t.x;
  44. ans[t.id]=i+n;
  45. }
  46. printf("%I64d\n%d",sum,ans[]);
  47. for(int i=;i<=n;i++) printf(" %d",ans[i]);
  48. printf("\n");
  49. }
  50. return ;
  51. }

codeforces round 433 C. Planning 贪心的更多相关文章

  1. Codeforces Round #433 (Div. 2)【A、B、C、D题】

    题目链接:Codeforces Round #433 (Div. 2) codeforces 854 A. Fraction[水] 题意:已知分子与分母的和,求分子小于分母的 最大的最简分数. #in ...

  2. 【Codeforces Round #433 (Div. 2) C】Planning

    [链接]h在这里写链接 [题意] 让你确定ti,使得∑(ti-i)*gi最小,其中ti∈[k+1..k+n],且每个ti都不能一样. 且ti>=i必须成立. [题解] 分解一下成为∑ti*gi ...

  3. Codeforces Round #433 (Div. 2, based on Olympiad of Metropolises)

    A. Fraction 题目链接:http://codeforces.com/contest/854/problem/A 题目意思:给出一个数n,求两个数a+b=n,且a/b不可约分,如果存在多组满足 ...

  4. Codeforces Round #433 Div. 1

    A:显然从大到小排序后贪心放在第一个能放的位置即可.并查集维护. #include<iostream> #include<cstdio> #include<cmath&g ...

  5. codeforces round #433 div2

    A:枚举一下就行了...居然wa了一发,题目一定要看清 #include<bits/stdc++.h> using namespace std; int n; int main() { c ...

  6. Educational Codeforces Round 64 -B(贪心)

    题目链接:https://codeforces.com/contest/1156/problem/B 题意:给一段字符串,通过变换顺序使得该字符串不包含为位置上相邻且在字母表上也相邻的情况,并输出. ...

  7. codeforces round 433 D. Jury Meeting

    题目大意: 输入n,m,k,分别代表城市的数量,城市编号1~n,航班的数量以及会议必须所有人员到会一起商议的天数,然后及时输入m行航班的信息,每一行输入d,f,t,c分别表示航班到站和始发的那一天(始 ...

  8. Codeforces Round#433 简要题解

    来自FallDream的博客,未经允许,请勿转载,谢谢. 我的号自从几个月前姿势水平过低疯狂掉分之后就没动过了  突然想上点分  就打了一场Div1  没想到打到了rank5  一发上橙了,可还行. ...

  9. [Codeforces Round #433][Codeforces 853C/854E. Boredom]

    题目链接:853C - Boredom/854E - Boredom 题目大意:在\(n\times n\)的方格中,每一行,每一列都恰有一个被标记的方格,称一个矩形为漂亮的当且仅当这个矩形有两个角是 ...

随机推荐

  1. oldlinux

    http://oldlinux.org/Linux.old/ http://oldlinux.org/Book-Lite/

  2. 第12篇Kubernetes 监控

        一.Weave Scope: Weave Scope 容器地图   创建 Kubernetes 集群并部署容器化应用只是第一步.一旦集群运行起来,我们需要确保一起正常,所有必要组件就位并各司其 ...

  3. C++ 排序(未完)

    参考: 快速排序 堆排序 各类排序 #include <iostream> #include <vector> #include <time.h> #include ...

  4. magento 站内优化和站外优化详解

    关于Magento如何如何我就不做评论了,一句话,谁用谁知道,搜索了下,百度和谷歌中文里还真没有一篇系统的关于magento seo的内容,花了一个上午的时间,稍微整理了一下,算是给新人一个指引吧.主 ...

  5. setTimeout()和setInterval()的用法及区别

    setInterval 方法表示每间隔一段时间执行一次函数,会一直执行下去,除非手动 clearInterval 来停止. var i = 10; var timer = setInterval(() ...

  6. I2C用户态驱动设计

    一.用户态驱动模型 1.1 I2C通用驱动代码 i2c_dev_init: static int __init i2c_dev_init(void) { int res; printk(KERN_IN ...

  7. Linux内核学习--写一个c程序,并在内核中编译,运行

    20140506 今天开始学习伟大的开源代表作:Linux内核.之前的工作流于几个简单命令的应用,因着对Android操作系统的情愫,“忍不住”跟随陈利君老师的步伐,开启OS内核之旅.学习路径之一是直 ...

  8. 从输入 URL 到页面展示,到底发生了什么

    从输入 URL 到页面展示,到底发生了什么 1.输入URL 当我们开始在浏览器中输入网址的时候,浏览器其实就已经在智能的匹配可能得 url 了,他会从历史记录,书签等地方,找到已经输入的字符串可能对应 ...

  9. 用Node编写RESTful API接口

    前言 本文将通过一个todo list前后端分离的小项目来讲解如何用Node创建符合RESTful风格的API接口. 创建HTTP服务器 我们先来了解下如何用Node创建HTTP服务器(熟悉的读者可以 ...

  10. setTag()与getTag()的使用介绍

    转载博客:http://www.cnblogs.com/topcoderliu/archive/2011/06/07/2074419.html View中的setTag(Onbect)表示给View添 ...