AtCoder Beginner Contest 115
阿新 • • 發佈:2018-12-09
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 | 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);
}