CF854A Fraction(gcd/数学)
也可以根据数学证明,O(1)算出。懒得写了。
#include <cstdio>
#include <cstring>
#define N 1005
inline int read(){
int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();
return x*f;
}
int n;
inline int gcd(int x,int y){
return y==0?x:gcd(y,x%y);
}
int main(){
n=read();
int x=n/2;
while(1){
if(gcd(x,n-x)==1) break;
x--;
}
printf("%d %d",x,n-x);
return 0;
}
CF854B Maxim Buys an Apartment(思路)
首先最小值,一般都是1,除了k==0和k==n的情况,均为0,最大值也为0.
对于其他情况的最大值,每一个有人居住的房间,最多能贡献2个good room,那么k个房间,最多能贡献k*2个good room,需要k*3个room,如果需要的比n还多,说明有些good room 被占据了,此时只要是空的room就是good的,因此最大值是n-k,否则是k*2.
#include <cstdio>
#include <cstring>
#define N 1005
#define ll long long
inline int read(){
int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();
return x*f;
}
int n,k;
int main(){
n=read();k=read();
if(k==0||k==n){
printf("%d %d",0,0);return 0;
}
printf("%d ",1);
if((ll)k*3>=n) printf("%d",n-k);
else printf("%d",k*2);
return 0;
}
CF853A Planning(贪心+优先队列)
每次在能起飞的飞机中,贪心的选择延误花费最大的起飞。用优先队列快速的找到这个最大的。
#include <bits/stdc++.h>
using namespace std;
#define N 300010
#define ll long long
#define pa pair<int,int>
inline int read(){
int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();
return x*f;
}
int n,k,a[N],ans[N];
ll res=0;
priority_queue<pa,vector<pa>,less<pa> >q;
int main(){
// freopen("a.in","r",stdin);
n=read();k=read();
for(int i=1;i<=n;++i) a[i]=read();
for(int i=1;i<=k;++i) q.push(make_pair(a[i],i));
for(int i=k+1;i<=k+n;++i){
if(i<=n) q.push(make_pair(a[i],i));
ans[q.top().second]=i;q.pop();
}
for(int i=1;i<=n;++i) res+=(ll)a[i]*(ans[i]-i);
printf("%lld\n",res);
for(int i=1;i<=n;++i) printf("%d ",ans[i]);
return 0;
}