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不可约分,如果存在多组满足条件的a和b,输出a/b最大的a和b。
题目思路:首先a+b=n,那么暴力枚举i和n-i,且gcd(i,n-i)==1,由于i越大是n-i越小,则a/b的值越大。
代码:
1 //Author: xiaowuga 2 #include <bits/stdc++.h> 3 using namespace std; 4 #define inf 0x3f3f3f3f 5 #define MAX INT_MAX 6 #define mem(s,ch) memset(s,ch,sizeof(s)) 7 const long long N=100000; 8 const long long mod=1e9+7; 9 typedef long long LL; 10 typedef int II; 11 typedef unsigned long long ull; 12 #define nc cout<<"nc"<<endl 13 #define sp " " 14 int main() { 15 ios::sync_with_stdio(false);cin.tie(0); 16 II n; 17 cin>>n; 18 II a,b; 19 for(II i=1;i<=n/2;i++){ 20 if(__gcd(i,n-i)==1){ 21 a=i;b=n-i; 22 } 23 } 24 cout<<a<<' '<<b<<endl; 25 return 0; 26 }
B. Maxim Buys an Apartment
题目链接:http://codeforces.com/contest/854/problem/B
题目意思:有n个房屋排成一排,现在其中k个房屋已经住了人,但是不知道其中的哪些房屋住进了房屋,但是小明喜欢住进邻居的房屋中有人住进的的房子里。问最少有多少个房屋满足条件,最多有多少个房屋满足条件。
题目思路:首先如果首先如果n远大于k了话,那么每一个住人的房屋,周围的两个房屋都满足小明的条件,所以我们想到每三个放一个。如果k×3>n,那么答案就是n-k,否则答案就是2×k,当然还有一些特殊情况,比如n==k还有k==0的时候,需要特判一下。
代码:
1 /* *********************************************** 2 Author :xiaowuga 3 Created Time :2017年10月18日 星期三 13时36分58秒 4 File Name :Desktop/B.cpp 5 ************************************************ */ 6 #include <bits/stdc++.h> 7 typedef long long LL; 8 #define endl "\n" 9 #define inf 0x3f3f3f3f 10 const long long N=1000000; 11 const long long mod=1e9+7; 12 using namespace std; 13 int main(){ 14 ios::sync_with_stdio(false);cin.tie(0); 15 LL n,k; 16 cin>>n>>k; 17 cout<<(k&&k<n)<<' '<<min(n-k,2*k)<<endl; 18 return 0; 19 }
C. Planning
题目链接:http://codeforces.com/contest/854/problem/C
题目意思:原本有n个航班,他们的起飞时间是1-n,现在机场规定在每一天的前k分钟不能有飞机起飞,那么就得有航班起飞要延误,现在给出每个航班延误一分钟所消耗的费用,问你怎么安排飞机的起飞才能使花费最少,飞机起飞时间不能比原本的要早。
题目思路:对于一个时间,用一个优先队列处理能放在当前时间的拥有每分钟最大损失的航班,这样只需要n*logn的复杂度。
题目代码:
1 //Author: xiaowuga 2 #include <bits/stdc++.h> 3 using namespace std; 4 #define inf 0x3f3f3f3f 5 #define MAX INT_MAX 6 #define mem(s,ch) memset(s,ch,sizeof(s)) 7 const long long N=100000; 8 const long long mod=1e9+7; 9 typedef long long LL; 10 typedef int II; 11 typedef unsigned long long ull; 12 #define nc cout<<"nc"<<endl 13 #define sp " " 14 int main() { 15 ios::sync_with_stdio(false);cin.tie(0); 16 struct node{ 17 LL c,id; 18 bool operator <(const node &m) const { 19 return c<m.c; 20 } 21 }; 22 LL n,k; 23 vector<node>a; 24 cin>>n>>k; 25 a.resize(n+1); 26 priority_queue<node>q; 27 for(LL i=1;i<=n;i++){ 28 cin>>a[i].c; 29 a[i].id=i; 30 } 31 vector<int>ans(n+1); 32 for(LL i=1;i<=k;i++) q.push(a[i]); 33 for(LL i=k+1;i<=n+k;i++){ 34 if(i<=n) q.push(a[i]); 35 auto now=q.top(); 36 q.pop(); 37 ans[now.id]=i; 38 } 39 LL sum=0; 40 for(II i=1;i<=n;i++){ 41 sum+=(ans[i]-i)*a[i].c; 42 } 43 cout<<sum<<endl; 44 for(II i=1;i<=n;i++) cout<<ans[i]<<' '; 45 return 0; 46 }