【jzoj】2018.1.30NOIP普及组——模拟赛D组
@_@
前言
寫博客時(shí)間 2018/1/30 22:36。
感想:出數(shù)據(jù)的dalao我服!
正題
題目1:二項(xiàng)式展開式(jzoj2254)
輸入一個(gè)整數(shù),求展開(a+b)^n。展開方式為 (a+b)^n=?a^n+?a^(n-1)b+?a^(n-2)b^2+…+?b^n
其中” ? “為系數(shù)。如果系數(shù)為 1,則需要省略系數(shù);如果次數(shù)為 1,則需要省略次數(shù);如果次數(shù)為 0,則需要省略;如果系數(shù)為 0,則需要省略這一項(xiàng)。注意:前面(a+b)^n 的次數(shù)n是必有的。
這里求組合我用的是楊輝三角。
樣例輸入
樣例輸入1
3
樣例輸入2
5
樣例輸出
樣例輸出1
(a+b)^3=a^3+3a^2b+3ab^2+b^3
樣例輸出2
(a+b)^5=a^5+5a^4b+10a^3b^2+10a^2b^3+5ab^4+b^5
代碼
#include<cstdio> using namespace std; int n; unsigned long long f[67][67]; int main() {//freopen("power.in","r",stdin);//freopen("power.out","w",stdout);scanf("%d",&n);if (n==1) {printf("(a+b)^1=a+b");return 0;}//特殊情況if (n==2) {printf("(a+b)^2=a^2+2ab+b^2");return 0;}//特殊情況f[0][0]=1;for (int i=1;i<=n;i++){f[i][0]=1;for (int j=1;j<=n;j++){f[i][j]=f[i-1][j]+f[i-1][j-1];}}//楊輝三角printf("(a+b)^%d=",n);//開頭輸出for (int i=0;i<=n;i++){if (i==0) printf("a^%d",n);//頭else if (i==1) printf("%da^%db",n,n-1);else if (i==n-1) printf("%dab^%d",n,n-1);else if (i!=n) printf("%llda^%db^%d",f[n][i],n-i,i);//輸出不解釋if (i!=n) printf("+");//加號(hào)if (i==n) printf("b^%d",n);//尾} }題目2:溜冰(jzoj2255)
一個(gè)冰道,長(zhǎng)L,有N個(gè)轉(zhuǎn)彎點(diǎn)。每個(gè)轉(zhuǎn)彎點(diǎn)限速S[i],距離起點(diǎn)D[i]米處。每一米速度可以加1或減1。求這條道能加速到的最快速度。
因此最快速度是5。
輸入
第一行兩個(gè)整數(shù)L和N。
第二行到第N+1行:第i+1行表示第i個(gè)轉(zhuǎn)彎處的兩個(gè)參數(shù)D[i],S[i]。
輸出
輸出僅一行,一個(gè)整數(shù)表示滑行過程中的最大速度(包括起點(diǎn)和終點(diǎn)的速度)。
樣例輸入
14 3
11 1
7 3
13 8
樣例輸出
5
首先為了方便處理,我們先根據(jù)距離進(jìn)行一次快排。
我們不難發(fā)現(xiàn)這冰道有3種情況。
1.從一個(gè)點(diǎn)無論如何加速都無法到達(dá)下一個(gè)的最大限速,如圖:
這里我們就不停加速就是 s[i]=s[i-1]+d[i]-d[i-1] ans=max(ans,s[i])
2.
那我們先假設(shè)距離第一個(gè)點(diǎn)x米前減速,之后加速。那我們可以推一下x是前一段距離,s[i]+x是加速到達(dá)的高度,s[i]+x-s[i+1]是需要減速的距離,用兩段距離加起來就是它們之間的長(zhǎng)度也就是x+s[i]+x-s[i+1]=d[i+1]-d[i],然后就可以推出 x=(s[i]+s[i+1]+d[i])/2。
3.
如果到達(dá)前一個(gè)點(diǎn)的最大限速,就算不停減速也到不了下一個(gè)點(diǎn)的最大限速,那我們只能提前到推一遍推出新的最大限速。就算:s[i-1]=s[i]+d[i]-d[i-1]
代碼
#include<cstdio> #include<algorithm> using namespace std; struct point{int x,w; };//結(jié)構(gòu)體,快排用 point a[100001]; int sp,l,ll,nsp,n,s; bool cmp(point dx,point dy) {return dx.x<dy.x; }//快排函數(shù) int main() {//freopen("skate.in","r",stdin);//freopen("skate.out","w",stdout);scanf("%d %d",&l,&n);for (int i=1;i<=n;i++){ scanf("%d%d",&a[i].x,&a[i].w);}//輸入sort(a+1,a+n+1,cmp);//排序for (int i=n;i>=1;i--){a[i-1]=min(a[i-1].w,a[i].w+a[i].x-a[i-1].x);//第三種情況}a[0].w=1;//起點(diǎn)速度為1for (int i=1;i<=n;i++){ll=a[i].x-a[i-1].x;//距離if (a[i].w>a[i-1].w){if (a[i-1].w+ll<=a[i].w) {a[i].w=a[i-1].w+ll;s=max(a[i].w,s);}//第一種情況else {s=max(s,(int)(a[i].w+a[i-1].w+ll)/2);}//第二種}else {s=max(s,(int)(a[i].w+a[i-1].w+ll)/2);}//第二種}s=max(s,a[n].w+l-a[n].x);//終點(diǎn)前的加速printf("%d",s);//輸出 }題目3:方案數(shù)(jzoj2256)
有N個(gè)人,無數(shù)塊黑白巧克力。其中每個(gè)人只能拿一種巧克力,至少c個(gè)人拿了巧克力。接下來2行,分別表示每個(gè)同學(xué)最多拿黑巧克力的個(gè)數(shù)和最多拿白巧克力的個(gè)數(shù)。輸出他們拿巧克力的方案數(shù)%10007。
樣例輸入
樣例輸入1
2 2
1 1
1 1
樣例輸入2
2 2
2 2
2 3
樣例輸出
樣例輸出1
1
樣例輸出2
4
我們用f[i][j]來表示前i個(gè)人拿了j個(gè)巧克力的方案數(shù),然后把f[i][c+1]+f[i][c+2]+f[i][c+3]…都合并到f[i][c]那里。動(dòng)態(tài)轉(zhuǎn)移方程:
f[i][j]=f[i-1][j]*b[i] + f[i-1][j-1]*a[i](j!=c)
f[i][j]=f[i-1][j](a[i]+b[i]) + f[i-1][j-1]a[i] (j=c)
f[i-1][j]*b[i]表示白巧克力
f[i-1][j-1]*a[i]表示黑巧克力
f[i-1][j-1]*a[i]表示已經(jīng)到達(dá)或超過20個(gè)人選的黑巧克力
#include<cstdio> #include<iostream> using namespace std; int f[100001][21],n,c,bl[100001],wh[100001],s; int main() {//freopen("fas.in","r",stdin);//freopen("fas.out","w",stdout);scanf("%d%d",&n,&c);s=1;f[0][0]=1;//初始化for (int i=1;i<=n;i++){scanf("%d",&bl[i]);bl[i]%=10007;}for (int i=1;i<=n;i++){scanf("%d",&wh[i]);wh[i]%=10007;f[i][0]=(f[i-1][0]*(wh[i]%10007))%10007;//初始化2}for (int i=1;i<=n;i++){for (int j=1;j<=c;j++){if (j<c) f[i][j]+=(f[i-1][j]*wh[i]%10007+f[i-1][j-1]*bl[i]%10007)%10007;else f[i][j]+=((f[i-1][j]*((wh[i]+bl[i])%10007))%10007+(f[i-1][j-1]*bl[i])%10007)%10007;//動(dòng)態(tài)轉(zhuǎn)移}}printf("%d",f[n][c]);//輸出 }
題目4:小L(jzoj2257)
給你N個(gè)數(shù)對(duì)(a[i], b[i]),計(jì)算函數(shù)
函數(shù)y四舍五入取整。
將N個(gè)數(shù)對(duì)去掉其中的K個(gè)后計(jì)算一個(gè)新的y值,均能滿足y ≤ λ,求最小的λ 值。
輸入
輸入包含多組數(shù)據(jù),每組測(cè)試數(shù)據(jù)包含:
第一行兩個(gè)整數(shù)N和 K;
第二行為N個(gè)數(shù):a[1] a[2] … a[n]
第三行為N個(gè)數(shù):b[1] b[2] … b[n]
當(dāng)N、K均為0時(shí)輸入結(jié)束。
輸出
對(duì)應(yīng)每組數(shù)據(jù)輸出一行,即找到的最小的λ值。
樣例輸入
3 1
5 0 1
5 1 6
4 2
1 2 7 9
5 6 7 9
0 0
樣例輸出
83
100
設(shè)函數(shù)值y的最小值為x,則:
則:
則:
最后二分答案
代碼
#include<cstdio> #include<algorithm> #include<cmath> using namespace std; long long n,k; long long s,s1,s2,sa,sb,m1,m2,left,right; struct point{long long n1,n2;long long c; }; point a[10001]; bool cmp(point x,point y) {return x.c>y.c; } bool ok(int x) {long long s1=0,s2=0;for (int i=1;i<=n-k;i++){s1+=a[i].n1;s2+=a[i].n2;//累加}return round(100.0*s1/s2)>x;//四舍五入 } int main() {freopen("math.in","r",stdin);freopen("math.out","w",stdout);while (true){scanf("%d%d",&n,&k);if (n==0 && k==0) break;m2=(long long)1e18;sa=0;sb=0;m1=0;for (int i=1;i<=n;i++){scanf("%d",&a[i].n1);sa+=a[i].n1;m1=max(m1,(long long)a[i].n1);}for (int i=1;i<=n;i++){scanf("%d",&a[i].n2);sb+=a[i].n2;m2=min(m2,(long long)a[i].n2);}left=100*sa/sb;right=100*m1/m2;//確定范圍while (left<=right)//二分答案{long long mid=(left+right)/2;for (int i=1;i<=n;i++) a[i].c=a[i].n1*100-mid*a[i].n2;//計(jì)算sort(a+1,a+1+n,cmp);//快排if (ok(mid)) left=mid+1;//判斷else right=mid-1;}printf("%d\n",left);//輸出} }后序
其實(shí)這后面是我第二天來寫的,好了去做題了(^o^)/
總結(jié)
以上是生活随笔為你收集整理的【jzoj】2018.1.30NOIP普及组——模拟赛D组的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 变形记廖洪毅是哪一期
- 下一篇: 【jzoj】2018.1.31 NOIP