标签:
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