如图
[TOC]
https://vjudge.net/contest/184118#problem
A - Fraction CodeForces - 854A
题意
- 给出一个分子分母的和,求出分子分母互质的最大分数
题解
#include<iostream>
using namespace std;
int gcd(int a,int b){return b?gcd(b,a%b):a;}
int main(){
int l,r,n;cin>>n;
if(n&1){
l=n/2;r=n/2+1;
}
else {
l=n/2-1;r=n/2+1;
}
while(gcd(r,l)>1){
l--;r++;
}
cout<<l<<" "<<r;
}
B - Maxim Buys an Apartment CodeForces - 854B
题意
- 一个一个长度为n的数组中有k个1,剩下的是0.组合方式未定.
- 所谓好点为自身是0,旁边至少有一个1的点.
- 求所给的n,k最少和最多能产生多少好点.
题解
#include<bits/stdc++.h>
using namespace std;
int main(){
int n,k;cin>>n>>k;
if(k==0||k==n)cout<<"0 0";
else cout<<1<<" "<<min(n-k,2*k);
}
C - Planning CodeForces - 854C
题意
- 飞机场,有n架飞机,每分钟一架飞机出发,第i架飞机延误一分钟的代价是c[i],现在要延误k分钟,使每架飞机调整后的时间不在调整前之前.
思路
- 用优先队列priority_queue,把队列中最大的数与外面交换.
题解
#include<bits/stdc++.h>
using namespace std;
int t[300005],c[300005],n,k,i,j,a1,a2;
long long int tot=0;
priority_queue <pair<int,int> > p;
pair <int,int> x;
int main(){
scanf("%d %d",&n,&k);
for(i=1;i<=n;i++)
scanf("%d",&c[i]);
for(i=1;i<=k;i++)
p.push({c[i],i});
for(i=k+1;i<=k+n;i++)
{
if(i<=n)p.push({c[i],i});
x=p.top();p.pop();
tot+=1LL*(1LL*i-x.second)*x.first;
t[x.second]=i;
if(p.empty())break;
}
printf("%lld\n",tot);
for(i=1;i<=n;i++)
printf("%d ",t[i]);
}
D - Jury Meeting CodeForces - 854D
见上图.