【jzoj】2018.2.1 NOIP普及组——D组模拟赛
前言
懶…
正題
題1:牛車(jzoj1390)
有m條公路,有n頭牛各開(kāi)一輛車,如果有x輛車開(kāi)在它前門,它速度就會(huì)降低d*x,路上速度至少為l。求有多少頭牛可以上路。
輸入
第1行: 4個(gè)空格隔開(kāi)的整數(shù)N,M,D,L
第2..N+1行: 第i+1行描述第i頭牛的起初車速。
輸出
第一行: 輸出一個(gè)整數(shù)表示最多可以在高速上行駛的牛車數(shù)量。
樣例輸入
3 1 1 5
5
7
5
樣例輸出
2
貪心,一行一行的從小到大塞牛
代碼
#include<cstdio> #include<algorithm> using namespace std; int n,m,d,l,a[50001],s,num[50001],j; int main() {scanf("%d%d%d%d",&n,&m,&d,&l);for (int i=1;i<=n;i++) scanf("%d",&a[i]);//輸入sort(a+1,a+1+n);//排序for (int i=1;i<=n;i++){for (j=1;j<=(n-1)/m+1;j++)//最多可以塞幾頭牛{if (a[i]-d*(j-1)>=l && num[j]<m)//尋找位置{num[j]++;break;}//塞}if (j<=(n-1)/m+1) s++;//塞入}printf("%d",s);//輸出 }題2:危險(xiǎn)系數(shù)(jzoj1391)
有n個(gè)島嶼,要按順序到達(dá)m個(gè)島嶼(可以重復(fù)或不連續(xù)),已知每個(gè)島之間的危險(xiǎn)系數(shù)。求最小危險(xiǎn)系數(shù)。
輸入
第1行: 兩個(gè)數(shù), N 和 M
第 2..M+1行: 第i+1行表示給定的序列中第i個(gè)島嶼A_i
第M+2..N+M+1行:每行N個(gè)整數(shù),表示島嶼之間的危險(xiǎn)系數(shù),對(duì)角線上一定是0。
輸出
輸出滿足要求的最小危險(xiǎn)系數(shù)
樣例輸入
3 4
1
2
1
3
0 5 1
5 0 2
1 2 0
樣例輸出
7
最短路,因?yàn)橐竺總€(gè)點(diǎn)的所以用Floyd算法(反正數(shù)據(jù)小)
代碼
#include<cstdio> #include<iostream> using namespace std; int n,m,f[10001],a[101][101],s; int main() {scanf("%d%d",&n,&m);for (int i=1;i<=m;i++) scanf("%d",&f[i]);for (int i=1;i<=n;i++)for (int j=1;j<=n;j++)scanf("%d",&a[i][j]);for (int k=1;k<=n;k++)for (int i=1;i<=n;i++)for (int j=1;j<=n;j++)if (i!=j && i!=k && j!=k){a[i][j]=min(a[i][j],a[i][k]+a[k][j]);}//Floyd算法for (int i=2;i<=m;i++){s+=a[f[i-1]][f[i]];//計(jì)算距離}printf("%d",s); }題目3:前綴轉(zhuǎn)后綴(jzoj1590)
輸入一個(gè)前綴表達(dá)式,轉(zhuǎn)成后綴表達(dá)式
輸入
輸入一個(gè)前綴表達(dá)式,運(yùn)算符只有“+”和“-”,操作數(shù)都是只有1個(gè)位數(shù)字(0到9),運(yùn)算符和操作數(shù)之間都用一個(gè)空格隔開(kāi),表達(dá)式?jīng)]有前導(dǎo)空格。每個(gè)表達(dá)式都是合法的,并且運(yùn)算符不超過(guò)20個(gè)。
輸出
輸出對(duì)應(yīng)的后綴表達(dá)式。
樣例輸入
1
樣例輸出
1
如圖建立一顆樹(shù),求出他的后序遍歷就好了。這里不難發(fā)現(xiàn),只有符號(hào)后才有分支(兩個(gè))。
代碼
#include<cstdio> #include<cstring> using namespace std; struct point{int son1,son2; }; point tree[201]; int m,n; char c[201]; int buld(int x)//建樹(shù) {m++;//位置if (c[x]=='+' || c[x]=='-')//符號(hào){tree[x].son1=buld(m+1);//分支tree[x].son2=buld(m+1);//分支return x;}else {tree[x].son1=-1;tree[x].son2=-1;//數(shù)字沒(méi)有分支return x;} } int print(int x)//后序遍歷輸出 {if (tree[x].son1!=-1) print(tree[x].son1);if (tree[x].son2!=-1) print(tree[x].son2);printf("%c ",c[x]); } int main() {//freopen("j4.in","r",stdin);//freopen("j4.out","w",stdout);n=0;char w;while ((c[++n]=getchar())!='\n') {w=getchar();if (w=='\n') break;}//讀入n--;buld(1);print(1); }題目4:游戲(jzoj1591)
有4種材料,ABCD。每種材料有一定數(shù)量,以下情況可以產(chǎn)生反應(yīng):
AABDD
ABCD
CCD
BBB
AD
兩個(gè)人輪流取材料,直到有人無(wú)法產(chǎn)生反應(yīng)為止就輸了。兩個(gè)人是聰明絕頂?shù)娜恕?
求勝者
輸入
第一行輸入一個(gè)整數(shù)N(1<=N<=100),表示游戲次數(shù),接下來(lái)N行,每行四個(gè)整數(shù),分別表示游戲開(kāi)始時(shí)A,B,C,D四種材料的數(shù)量。假設(shè)一開(kāi)始每種材料的數(shù)量都在0到60之間。
輸出
對(duì)于每次游戲輸出贏者的名字。
樣例輸入
6
0 2 0 2
1 3 1 3
1 5 0 3
3 3 3 3
8 8 6 7
8 8 8 8
樣例輸出
Roland
Patrick
Roland
Roland
Roland
Patrick
這里用記憶化搜索模擬情況,然后用返回確定勝者。
代碼
#include<cstdio> using namespace std; int w[5][4]={{2,1,0,2},{1,1,1,1},{0,0,2,1},{0,3,0,0},{1,0,0,1}};//預(yù)處理情況 int f[61][61][61][61],a,b,c,d,n; int dfs(int a,int b,int c,int d) {if (f[a][b][c][d]!=0) return f[a][b][c][d];//記憶化搜索for (int i=0;i<5;i++){if (a>=w[i][0] && b>=w[i][1] && c>=w[i][2] && d>=w[i][3])//如果可以取{if (dfs(a-w[i][0],b-w[i][1],c-w[i][2],d-w[i][3])==2)//搜索{f[a][b][c][d]=1;//記憶return 1;}}}f[a][b][c][d]=2;//記憶return 2; } int main() {//freopen("j5.in","r",stdin);//freopen("j5.out","w",stdout);scanf("%d",&n);for (int i=1;i<=n;i++){scanf("%d%d%d%d",&a,&b,&c,&d);if (dfs(a,b,c,d)==2) printf("Roland\n");else printf("Patrick\n");//輸出} }總結(jié)
以上是生活随笔為你收集整理的【jzoj】2018.2.1 NOIP普及组——D组模拟赛的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 长城干红葡萄酒有哪些介绍吗
- 下一篇: jk是啥? jk含义详解