您的位置:首页 > 运维架构

Codeforces Round #433 (Div. 2, based on Olympiad of Metropolises)题解

2017-09-07 15:40 429 查看

其实我是比较后悔的,距离最终目标又远了一步。

Wuuuuuuu..... 只做了2题,完全GG

传送门 :http://codeforces.com/contest/854/题目传送门



对了 现在还不会用Markdown,于是就用了sublime编辑的,哈哈--*--

A. Fraction 照例水题

已知 n 为某个分子和分母的和,求所有小于1的分数中不可再约的最大分数。

直接 判断gcd(i,n-i)==1 ? answer = i : i-- ;

/*******************************************************************/
/*******************************************************************/
// author : ****
//     id : touchme-o
//problem : Fraction
//pro  id : A
/*******************************************************************/
/*******************************************************************/
#include <bits/stdc++.h>
using namespace std;
#define pb push_back
#define vi vector<int>
#define LL long long
#define MEM(a) memset(a,0,sizeof(a));
#define forn(i, n) for (int i = 0; i < (int)(n); ++i)
#define For(i,n) for(int i=1;i<=n;i++)
#define Fork(i,k,n) for(int i=k;i<=n;i++)
#define Rep(i,n) for(int i=0;i<n;i++)
#define ForD(i,n) for(int i=n;i;i--)
#define ForkD(i,k,n) for(int i=n;i>=k;i--)
#define RepD(i,n) for(int i=n;i>=0;i--)
#define lowbit(x) ((x)&-(x))
#define SI(a) ((a).size())

#define MAX 35
#define INF (0x3f3f3f3f)
#define F (1000000007)
#define IN(a) scanf("%d",&a);
int n;
int  gcd(int a,int b) {
return a%b==0 ? b : gcd(b,a%b);
}
int main(int argc, char const *argv[])
{
// freopen("data.in","r",stdin);
IN(n);
int l = 1 , r = n/2;
if(2*r == n ) r--;
while(r>=l && gcd(n-r,r)!=1) r--;
printf("%d %d\n",r,n-r);
return 0;
}


B. Maxim Buys an Apartment 还是比较简单的

题意是 Tom(随便起的名字) 要买房子。已知有n个房子,其中k个有人,Tom只能住在有人的房子的隔壁

问 他最多和最少的选择共多少种?



除了几个特殊的情况 minn = 1  max = 2*k  

k == 0 minn=mann=0

k == n minn=mann=0

so minn = min(1,min(n-k,k)) mann = min(n-k,2*k);

/*******************************************************************/
/*******************************************************************/
// author : ***
//     id : touchme-o
//problem : Maxim Buys an Apartment
//pro  id : B
/*******************************************************************/
/*******************************************************************/
#include <bits/stdc++.h>
using namespace std;
#define pb push_back
#define vi vector<int>
#define LL long long
#define MEM(a) memset(a,0,sizeof(a));
#define forn(i, n) for (int i = 0; i < (int)(n); ++i)
#define For(i,n) for(int i=1;i<=n;i++)
#define Fork(i,k,n) for(int i=k;i<=n;i++)
#define Rep(i,n) for(int i=0;i<n;i++)
#define ForD(i,n) for(int i=n;i;i--)
#define ForkD(i,k,n) for(int i=n;i>=k;i--)
#define RepD(i,n) for(int i=n;i>=0;i--)
#define lowbit(x) ((x)&-(x))
#define SI(a) ((a).size())

#define MAX 35
#define INF (0x3f3f3f3f)
#define F (1000000007)
LL n, k;
int main(int argc, char const *argv[])
{
// freopen("data.in", "r", stdin);
scanf("%lld%lld", &n, &k);
if (n == k) return 0 * puts("0 0");
printf("%lld %lld\n",min(k,1LL),min(n-k,2LL*k));
return 0;
}


C. Planning 全都是坑,全都是泪

题意是 1————n 一共n个航班依次起飞。现在k之前的航班都没起飞(晚点了),要重新制定航班。。。blablabla 。。。。 

花费是 (new_time - old_time)*c[i] (且不能比原定时间早起飞)



之前的思路是 一共要走 n*k 步,sort一下,把空位置加入优先队列,不断地把最小的值放到队列头的位置,

然后。。blablabla....... 一顿操作。。。。然后 GG



正确思路  神奇的贪心  我们每一刻都使用一架可以在这个时刻离开的飞机(当然也没有提前离开),而且延迟最小。

证明详情可以看codeforces上的blog(谁会关心贪心法的证明呢)

传送门:http://codeforces.com/blog/entry/54368

/*******************************************************************/
/*******************************************************************/
// author : ****
// id : touchme
//problem : Planning
//pro id : C 贪心
/*******************************************************************/
/*******************************************************************/
#include <bits/stdc++.h>
using namespace std;
#define pb push_back
#define vi vector<int>
#define LL long long
#define pi pair<int,int>
#define MEM(a) memset(a,0,sizeof(a));
#define forn(i, n) for (int i = 0; i < (int)(n); ++i)
#define For(i,n) for(int i=1;i<=n;i++)
#define Fork(i,k,n) for(int i=k;i<=n;i++)
#define Rep(i,n) for(int i=0;i<n;i++)
#define ForD(i,n) for(int i=n;i;i--)
#define ForkD(i,k,n) for(int i=n;i>=k;i--)
#define RepD(i,n) for(int i=n;i>=0;i--)
#define lowbit(x) ((x)&-(x))
#define SI(a) ((a).size())

#define MAX 600050
#define INF (0x3f3f3f3f)
#define F (1000000007)
int n, k;

priority_queue<pi> que;

int main(int argc, char const *argv[])
{
// freopen("data.in", "r", stdin);
scanf("%d%d", &n, &k);
std::vector<int> c(n+1,0);
std::vector<int> g(n+1,-1);

For(i, n) scanf("%d",&c[i]);
LL ans = 0;
for(int i=1;i<=n || !que.empty();i++) {
if(i<=n) que.push(make_pair(c[i],i));
if(i>k) {
pi now = que.top();que.pop();
ans += 1LL*now.first*(i-now.second);
g[now.second] = i;
}
}
printf("%lld\n",ans);
For(i,n-1) printf("%d ",g[i]); printf("%d\n",g
);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐