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\)的方格中,每一行,每一列都恰有一个被标记的方格,称一个矩形为漂亮的当且仅当这个矩形有两个角是 ...
随机推荐
- 【vlfeat】O(n)排序算法——计数排序
今天想在网上找一个实现好的er算法来着,没啥具体的资料,无奈只能看vlfeat的mser源码,看能不能修修补补实现个er. 于是,看到某一段感觉很神奇,于是放下写代码,跑来写博客,也就是这段 /* - ...
- Python3.5-20190513-廖老师-自我笔记-函数式编程
把复杂的任务拆成各个小的函数,通过函数的调用来完成任务.这就是面向过程编程. 高阶函数:就是让函数的参数能够接收别的函数.把函数作为参数传入到另一个函数. 函数名也是变量.和变量用法一样的,指向一个函 ...
- python 常用技巧 — 数组 (array)
目录: 1. 数组每一行除以这一行的总数(numpy divide row by row sum) 2. 数组每一行或者每一列求平均 (python average array columns or ...
- nohup及crontab定时任务
一.关于nohup: 1.假设有一 tash.sh 启动是:nohup /home/spex/bin_prodDemo/task.sh & 一定 ...
- 贾扬清谈大数据&AI发展的新挑战和新机遇
摘要:2019云栖大会大数据&AI专场,阿里巴巴高级研究员贾扬清为我们带来<大数据AI发展的新机遇和新挑战>的分享.本文主要从人工智能的概念开始讲起,谈及了深度学习的发展和模型训练 ...
- 阿里云 Centos 7 PHP7环境配置 LNMP
首先更新系统软件 $ yum update 安装nginx 1.安装nginx源 $ yum localinstall http://nginx.org/packages/centos/7/noarc ...
- ALAsset和ALAssetRepresentation详解
ALAsset类代表相册中的每个资源文件,可以通过它获取资源文件的相关信息还能修改和新建资源文件,ALAssetRepresentation类代表相册中每个资源文件的详细信息,可以通过它获取资源的大小 ...
- js与android原生交互
package com.liuhao.mysecond; import androidx.annotation.RequiresApi;import androidx.appcompat.app.Ap ...
- android:layout_gravity和android:gravity的区别 (转)
转:http://blog.csdn.net/shakespeare001/article/details/7843460 1.首先来看看android:layout_gravity和android: ...
- 2019ccpc秦皇岛/Gym102361 F Forest Program 仙人掌上dfs
题意: 某地沙漠化严重,沙漠里长了很多仙人掌,现在要让你删掉仙人掌的一些边让它的所有连通分量都是树,就完成了沙漠绿化(什么鬼逻辑?)让你计算删边的方案数. 仙人掌是一种特殊的图,它的每一条边只属于1或 ...