AtCoder Beginner Contest 115

虽然这次题目确实简单了点,但首次AK ATcoder ABC还是挺开心的。

C - Christmas Eve

排序然后遍历一遍计算出间隔k的最小差即可。

#include
#include
#include
#include
int h[100005];
using namespace std;
int main()
{
    int n,k;
    cin>>n>>k;
    for(int i=0;i>h[i];
    sort(h,h+n);
    int min=1000000000,m;
    for(int i=k-1;i

D - Christmas

打表,f记录当层总共的字母数,p记录p的个数。

每层可以表示为B 上一层 P 上一层 B。

从第n层开始减到0层,判断k在每层的位置,如果在当前层的BPB,加上当前位置前面的P数量,结束,否则进入上一层。

#include
#include
#include
#include
#include
typedef long long ll;
ll f[60];
ll p[60];
using namespace std;
int main()
{
    ll n,k;
    cin>>n>>k;
    f[0]=1;
    p[0]=1;
    for(int i=1;i<=n;i++)
    {
	f[i]=3+2*f[i-1];
	p[i]=1+2*p[i-1];
//	cout<f[n])k=f[n];
    while(n>=0)
    {
	if(k==0) break;
	if(n==0)
        {
	    sum++;
	    break;
        }
//	if(k==0) break;
	if(k==f[n])
	{
	    sum+=p[n];
	    break;
	}
	if(k==f[n-1]+2)
	{
	    sum+=p[n-1]+1;
	    break;
	}
	if(k>f[n-1]+2)
	{
	    sum+=p[n-1]+1;
	    k=k-2-f[n-1];
	}
	else if(k

 

你可能感兴趣的:(算法题解)