题目大意:

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

基本思路:

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

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

反思与总结:

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

代码如下:

(超时代码)

#include<bits/stdc++.h>

using namespace std;

#define rep(a,b,c) for(int (a)=(b);(a)<=(c);(a++))
#define drep(a,b,c) for(int (a)=(b);(a)>=(c);(a--))
#define mst(ans,false) memset(ans,0,sizeof(ans))
#define mkp make_pair typedef long long int ll;
typedef long double lb;
typedef pair<int,int> pii;
const int dx[]={-,,,};
const int dy[]={,-,,}; const int maxn = +;
struct Node
{
int id,val;
bool operator<(const Node& a)const
{
if(val==a.val) return id<a.id;
return val>a.val;
}
}node[maxn];
int vis[maxn*];
int idx[maxn];
int n,k;
int main()
{
while(scanf("%d%d",&n,&k)==)
{
for(int i=;i<=n;i++)
{
scanf("%d",&node[i].val);
node[i].id=i;
}
sort(node+,node+n+);
int t=k+n;
for(int i=k+;i<=k+n;i++) vis[i]=;
int pos=k+;
ll sum=;
for(int i=;i<=n;i++)
{
int tt=node[i].id;
if(tt>=pos)
{
for(int j=tt;j<=t;j++)
{
if(vis[j]!=) continue;
vis[j]=;
idx[node[i].id]=j;
sum+=(j-node[i].id)*node[i].val;
break;
} }
else
{ for(int j=pos;j<=t;j++)
{
if(vis[j]!=) continue;
vis[j]=;
idx[node[i].id]=j;
sum+=(j-node[i].id)*node[i].val;
break;
}
}
}
printf("%I64d\n",sum);
printf("%d",idx[]);
for(int i=;i<=n;i++) printf(" %d",idx[i]);
printf("\n");
}
return ;
}

(ac代码)

#include<bits/stdc++.h>

using namespace std;

const int maxn = +;
typedef long long ll; int ans[maxn];
struct Node
{
ll x;
int id;
bool operator<(const Node& a)const {return x<a.x;}
}node[maxn];
priority_queue<Node>pq; int main()
{
int n,k;
ll sum;
while(scanf("%d%d",&n,&k)==)
{
sum=;
while(!pq.empty()) pq.pop();
for(int i=;i<=n;i++)
{
scanf("%I64d",&node[i].x);
node[i].id=i;
if(i<=k) pq.push(node[i]);
}
for(int i=k+;i<=n;i++)
{
pq.push(node[i]);
Node t=pq.top();
pq.pop();
sum+=(i-t.id)*t.x;
ans[t.id]=i;
}
for(int i=;i<=k;i++)
{
Node t=pq.top();
pq.pop();
sum+=(i+n-t.id)*t.x;
ans[t.id]=i+n;
}
printf("%I64d\n%d",sum,ans[]);
for(int i=;i<=n;i++) printf(" %d",ans[i]);
printf("\n");
}
return ;
}

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. android中返回数据给上一个活动,可以用来回显数据

    (一)who简介:没错,就是startActivityForResult()方法,这个方法用来在活动被销毁的时候返回数据给上一个方法.参数说明: startActivityForResult(inte ...

  2. 获得本机物理ip地址mac

    https://blog.csdn.net/guang670248515/article/details/81040797 文章来源:https://blog.csdn.net/kingepoch/a ...

  3. oracle exp不生成dumpfile,预估出实际导出文件的大小。

    目的:在不创建dumpfile前预估出需要的导出文件大小.  适用于export     实验步骤如下:OS:  Linux test20 2.6.18-238.el5 #1 SMP Sun Dec ...

  4. 24.循环栅栏 CyclicBarrier

    import java.util.concurrent.BrokenBarrierException; import java.util.concurrent.CyclicBarrier; /** * ...

  5. springbootboot 语句

    -- ------------------------------ Table structure for `user`-- ----------------------------DROP TABL ...

  6. bzoj 3011

    传送门: http://www.lydsy.com/JudgeOnline/problem.php?id=3011 一想到这个第一反应是树形dp,然后10^18 (' '    ) 所以我直接搞了一个 ...

  7. tomcat的stratup小黑框名字修改

    Tomcat的bin目录下:catalina.out文件, TITLE就是Tomcat startup窗口的名称,282行默认是:Tomcat.这里建议改成“服务名+端口号”的方式,看起来一目了然.因 ...

  8. tomcat7以下线程控制

    web server允许的最大线程连接数还受制于操作系统的内核参数设置,通常Windows是2000个左右,Linux是1000个左右. 1.编辑tomcat安装目录下的conf目录下的server. ...

  9. QC增加Test、Defect字段

    QC--Tools--customization,在Project Entities中增加字段,在Project Lists中编辑Lookup List类型字段的指定值

  10. 人物-IT-胡玮炜:百科

    ylbtech-人物-IT-胡玮炜:百科 胡玮炜,女,汉族,1982年出生于浙江东阳,毕业于浙江大学城市学院新闻系,摩拜单车创始人 . 2004年胡玮炜从浙江大学城市学院新闻系毕业后进入<每日经 ...