虽然这次题目确实简单了点,但首次AK ATcoder ABC还是挺开心的。
C - Christmas Eve
排序然后遍历一遍计算出间隔k的最小差即可。
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstdlib>
int h[100005];
using namespace std;
int main()
{
int n,k;
cin>>n>>k;
for(int i=0;i<n;i++)
cin>>h[i];
sort(h,h+n);
int min=1000000000,m;
for(int i=k-1;i<n;i++)
{
m=h[i]-h[i-k+1];
if(m<min) min=m;
}
cout<<min<<endl;
}
D - Christmas
打表,f记录当层总共的字母数,p记录p的个数。
每层可以表示为B 上一层 P 上一层 B。
从第n层开始减到0层,判断k在每层的位置,如果在当前层的BPB,加上当前位置前面的P数量,结束,否则进入上一层。
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstdlib>
#include<cmath>
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[i]<<' '<<p[i]<<endl;
}
ll sum=0;
if(k>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<f[n-1]+2) k=k-1;
n--;
}
cout<<sum<<endl;
}