1. 程式人生 > >AtCoder Beginner Contest 115

AtCoder Beginner Contest 115

比賽連結

Tasks

# Title Time limit Memory limit
A Christmas Eve Eve Eve 2 sec 1024 MB Submit
B Christmas Eve Eve 2 sec 1024 MB Submit
C Christmas Eve 2 sec 1024 MB Submit
D
Christmas
2 sec 1024 MB Submit

A:

#include<bits/stdc++.h>
using namespace std;
int main(){
    cin>>n;n=25-n;
    printf("Christmas");
    while(n--)printf(" Eve");
}

B:

題意:

一個人買n件東西,其中最貴的一件半價,求要付多少錢。

#include<bits/stdc++.h>
#define Fur(i,x,y) for(ri i=x;i<=y;i++)
using namespace std;
int main(){
    int n,s=0,ma=0;
    cin>>n;
    Fur(i,1,n){
        int x=gi();
        s+=x;ma=MAX(ma,x);
    }
    s-=ma/2;
    printf("%d\n",s);
}

C:

題意:

從n個數裡選k個數,求所有被選的數中的最大數和最小數的差最小為多少?

方法:

排序後O(n)查詢

#include<bits/stdc++.h>
#define Fur(i,x,y) for(ri i=x;i<=y;i++)
using namespace std;
#define N 100010
int n,a[N],k,ans=1000000000;
int main(){
    cin>>n>>k;
    Fur(i,1,n)scanf("%d\n",&a[i]);
    sort(a+1,a+n+1);
    Fur(i,1,n-k+1)
        ans=MIN(ans,a[i+k-1]-a[i]);
    printf("%d\n",ans);
}

D:

題意:

Takaha先生決定製作一個多維漢堡。 L級漢堡(\(L>=0\))是以下內容:

一個0級漢堡是一個小餡餅。
​ L級漢堡(\(L≥1\))是一個麵包 + (L-1)級漢堡 + 一個小餡餅+另一個(L-1)漢堡+另一個麵包

例如:

說明:(旋轉90度)其中B和P代表麵包和餡餅

1級漢堡:BPPPB

2級漢堡:BBPPPBPBPPPBB

Takaha先生將製作的漢堡是一個N級漢堡。 Lachlun the Dachshund將從這個漢堡的底部吃掉X層(每一層是餡餅或麵包)。 她會吃多少餡餅?

題解:

很像這道題:Moo

不能直接模擬,要推出一點小規律

我們用\(s[d]\)代表d級漢堡有多少層餡餅,\(l[d]\)表示麵包和餡餅總共有多少層

按照餡餅夠成的規則進行模擬:

#include<bits/stdc++.h>
#define ll unsigned long long
#define il inline
#define Fur(i,x,y) for(int i=x;i<=y;i++)
using namespace std;
ll l[55],n,k,s[55],ans=0;
il void cl(){//預處理s,l
    l[0]=s[0]=1;
    Fur(i,1,50)l[i]=(l[i-1]<<1)+3,s[i]=(s[i-1]<<1)+1;
}
#define chk if(!k){cout<<ans<<endl;exit(0);}
/*
_:空的
.:麵包
bk:低一級級漢堡
$:餡餅
*/
il void dfs(ll d){
    if(d==0){
        chk;
        cout<<ans+1<<endl;exit(0);
    }
    chk;//  _
    k--;chk;// .
    if(k>=l[d-1]){ans+=s[d-1],k-=l[d-1];chk;}// .bk
    else dfs(d-1);
    ans++;k--;chk;// .bk$
    if(k>=l[d-1]){ans+=s[d-1],k-=l[d-1];chk;}// .bk&bk
    else dfs(d-1);
    k--;chk;// .bk&bk.
}
int main(){
    cl();
    cin>>n>>k;
    dfs(n);
}