标签:
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]);
}
标签:
原文地址:http://www.cnblogs.com/wuyuewoniu/p/4280983.html