码迷,mamicode.com
首页 > 其他好文 > 详细

Rockethon 2015

时间:2015-02-09 12:23:09      阅读:102      评论:0      收藏:0      [点我收藏+]

标签:

A. Game

题意:有两个人做游戏,A有n张牌,每次可以出1到k1张,B有m张牌,每次可以出1到k2张牌,当轮到谁,谁没有牌可出的时候即为输。

因为为了不输,出牌一定会使得自己坚持的回合尽可能多,那么两个人每局都只出一张牌,比较n,m的大小即可。

#include<stdio.h>
int main()
{
	int n,m,k1,k2;
	scanf("%d %d %d %d",&n,&m,&k1,&k2);
	if(n<=m) printf("Second\n");
	else
	printf("First\n");
}

 B2. Permutations 

题意:p为1,2,3,4,-----,n的一个排列,求使得满足这个等式的最大值的字典序排在第m个的序列 =_=这一题看懂题目看了好长时间---看懂题解看了好长时间--终于有一点点懂的意思了--555555555

技术分享

 

首先考虑f(p)最大,因为要使得f(p)最大,那么就要让小的数尽可能少地被覆盖到,所以对于1来说,它应该放在最前面或者最后面,放完1之后,再考虑2的位置,也是尽可能地放在边上,即为最前面或者最后面,其余的数以此类推。

 

再考虑字典序第m大 因为总的排列数:2^n-1(每个数都有两个位置可以选,最后一个数只剩下一个位置,所以是2^n-1)

当放1的时候,如果将1放在最前面,剩下的排列总数2^n-2,如果m大于2^n-2的话,显然不能满足(因为总的排列数都不够m),那么1只能放在最后面

然后就是对于1到n这n个数按照这样的办法来放

#include<iostream>  
#include<cstdio>  
#include<cstring>  
#include<algorithm>  
using namespace std;
int main()
{
	int i,k,t,n,ans[100];
	long long m;
	scanf("%d %I64d",&n,&m);
	k=1;t=n;
	for(i=1;i<=n;i++)
	{
		if(m>(1LL<<(n-1-i)))
		{
			ans[t--]=i;
			m=m-(1LL<<(n-1-i));
		}
		else
		ans[k++]=i;				
	}
	for(i=1;i<=n;i++)
	printf("%d ",ans[i]);
}

  

Rockethon 2015

标签:

原文地址:http://www.cnblogs.com/wuyuewoniu/p/4280983.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!