codeforces round 433 C. Planning 贪心
题目大意:
输入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 贪心的更多相关文章
- Codeforces Round #433 (Div. 2)【A、B、C、D题】
题目链接:Codeforces Round #433 (Div. 2) codeforces 854 A. Fraction[水] 题意:已知分子与分母的和,求分子小于分母的 最大的最简分数. #in ...
- 【Codeforces Round #433 (Div. 2) C】Planning
[链接]h在这里写链接 [题意] 让你确定ti,使得∑(ti-i)*gi最小,其中ti∈[k+1..k+n],且每个ti都不能一样. 且ti>=i必须成立. [题解] 分解一下成为∑ti*gi ...
- 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不可约分,如果存在多组满足 ...
- Codeforces Round #433 Div. 1
A:显然从大到小排序后贪心放在第一个能放的位置即可.并查集维护. #include<iostream> #include<cstdio> #include<cmath&g ...
- codeforces round #433 div2
A:枚举一下就行了...居然wa了一发,题目一定要看清 #include<bits/stdc++.h> using namespace std; int n; int main() { c ...
- Educational Codeforces Round 64 -B(贪心)
题目链接:https://codeforces.com/contest/1156/problem/B 题意:给一段字符串,通过变换顺序使得该字符串不包含为位置上相邻且在字母表上也相邻的情况,并输出. ...
- codeforces round 433 D. Jury Meeting
题目大意: 输入n,m,k,分别代表城市的数量,城市编号1~n,航班的数量以及会议必须所有人员到会一起商议的天数,然后及时输入m行航班的信息,每一行输入d,f,t,c分别表示航班到站和始发的那一天(始 ...
- Codeforces Round#433 简要题解
来自FallDream的博客,未经允许,请勿转载,谢谢. 我的号自从几个月前姿势水平过低疯狂掉分之后就没动过了 突然想上点分 就打了一场Div1 没想到打到了rank5 一发上橙了,可还行. ...
- [Codeforces Round #433][Codeforces 853C/854E. Boredom]
题目链接:853C - Boredom/854E - Boredom 题目大意:在\(n\times n\)的方格中,每一行,每一列都恰有一个被标记的方格,称一个矩形为漂亮的当且仅当这个矩形有两个角是 ...
随机推荐
- jQuery效果-隐藏与显示 小方块的移除
html <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <ti ...
- html5中的选择器
1.html5中的属性选择器 <body> <style type=text/css> <!--1>完全匹配选择器--> [id=test]{ color:r ...
- oracle死锁查询
select sess.sid ||','|| sess.serial#, lo.oracle_username, lo.os_user_name, ao.object_name, lo.locked ...
- 使用KEIL C51实现的简单合作式多任务操作系统内核(单片机实现版本)
基于网上网友的代码,自己在单片机上实现, 特此记录分享之. 基于https://blog.csdn.net/yyx112358/article/details/78877523 //使用KEIL C5 ...
- Dubbo底层原理
dubbo 1. 依赖 spring扫描注入 2. 反射 3. 动态代理 4.Zookeeper 5.netty 服务不在本地,具体实现在远程 可以用Dubbo 基于XML 效率低 传输低 解析低 ...
- Delphi 获取系统的语言环境参数GetSystemDefaultLangID、VerLanguageName、GetLocaleInfo
1 核心的两个API函数:GetSystemDefaultLangID 和 VerLanguageName. GetSystemDefaultLangID:获得系统默认语言的ID VerLanguag ...
- 每天一个linux命令:nl(12)
nl nl命令读取 file 参数(缺省情况下标准输入),计算输入中的行号,将计算过的行号写入标准输出.在输出中,nl命令根据您在命令行中指定的标志来计算左边的行.输入文本必须写在逻辑页中.每个逻辑页 ...
- loadRunner函数之web_find
int web_find( const char *StepName, <Attributes and Specifications list>, char *searchstring, ...
- numpy 中文手册
https://yiyibooks.cn/xx/NumPy_v111/user/index.html
- AutoFac控制反转 转载https://blog.csdn.net/u011301348/article/details/82256791
一.AutoFac介绍 Autofac是.NET里IOC(Inversion of Control,控制反转)容器的一种,同类的框架还有Spring.NET,Unity,Castle等.可以通过NuG ...