奋斗群群赛—6
T1:Fraction
题目位置:
题意:
即给你一个数字n,让你找到a,b使得a+b=n而且a,b互质,求a的最大情况!
AC代码:
#include <bits/stdc++.h>
using namespace std;
int gcd(int x,int y)
{
if(y==0) return x;
return gcd(y,x%y);
}
int main()
{
int n;
cin>>n;
// cout<<gcd(18,27)<<endl;
for(int i=n/2; i>=1; i--)
{
int j=n-i;
if(gcd(i,j)==1)
{
cout<<i<<" "<<j<<endl;
return 0;
}
}
}
小反思:
主要就是一个gcd递归函数的使用考研!
T2:Maxim Buys an Apartment
题目位置:
题意:
只要就是有n所房子,有k的房子已经被人住了,而我想要与别人相邻,而且房子还没有出租的情况,问最多有几种选择和最少有几种选择?
比如(6,3) 最小情况是1,2,3被卖了,而自己只有4住,而最多就是1,3,5被卖了,而自己可以住2,4,6!于是输出1,3
AC代码:
#include <bits/stdc++.h>
using namespace std;
int main()
{
long long int n,k;
cin>>n>>k;
if(n<=k)
{
cout<<0<<" "<<0<<endl;
return 0;
}
if(k==0)
{
cout<<0<<" "<<0<<endl;
return 0;
}
else
{
cout<<1<<" ";
if(3*k<=n)
cout<<2*k;
if(3*k>n)
cout<<n-k;
return 0;
}
}
小反思:
主要是3*10^9会爆int的范围,所以就一直没有过,应该考虑数据的范围才好!
还有就是k=0,时是未有房子可以买的!
T3:Planning
题目位置:
题意:
主要讲了有n架飞机,第i架是在imin起飞的,但是现在出现了故障,导致k分钟前都不能够起飞,这样的话每架飞机有延误而花费的费用,为1分钟的超时价格,让你求最小的花费!
利用堆来做会十分快捷!
AC代码:
#include <bits/stdc++.h>
using namespace std;
#define ll long long
const int N=300005;
int a[N],air[N];
priority_queue<pair<ll,ll> > airport;
int main() {
int n,k;
cin>>n>>k;
long long int tot=0;
for(int i=1; i<=n; i++)
cin>>a[i];
for(int i=1; i<=k; i++)
airport.push(make_pair(a[i],i));
for(int i=k+1; i<=n+k; i++) {
if(i<=n)
airport.push(make_pair(a[i],i));
pair<ll,ll>plane=airport.top();
airport.pop();//¿ªÊ¼ÕûÀí
tot+=plane.first*(i-plane.second);
air[plane.second]=i;
}
cout<<tot<<endl;
for(int i=1; i<=n; i++)
cout<<air[i]<<" ";
return 0;
}
小反思:
学会优先队列是关键啊!
反思:
1.学会查找数据范围会不会超!
2.学会堆!