【jzoj】2018.1.31 NOIP普及组——D组模拟赛
前言
今天題目比較水a(chǎn)nd我進(jìn)了C組,不過(guò)太太太太太太太太太太太太太太太太絕望了QAQ。所以我也沒(méi)有做C組的題。寫(xiě)完博客我就做O(∩_∩)O。
正題
題1:奇數(shù)統(tǒng)計(jì)(jzoj1547)
就是輸入n個(gè)數(shù),輸出出現(xiàn)次數(shù)為奇數(shù)的一個(gè)數(shù)(只有一個(gè))。
輸入
第一行是N,下一行有N個(gè)正整數(shù)。
輸出
出現(xiàn)了奇數(shù)次的數(shù)。
樣例輸入
9
3 1 2 2 17 1 3 17 3
樣例輸出
3
桶不解釋
代碼
#include<cstdio> #include<iostream> using namespace std; int n,a[10001],x,ans; int main() {//freopen("count.in","r",stdin);//freopen("count.out","w",stdout);scanf("%d",&n);for (int i=1;i<=n;i++){scanf("%d",&x);a[x]++;} for (int i=1;i<=10000;i++) if (a[i]%2==1) {printf("%d",i);return 0;} }相信我不加批注你們也懂不O(∩_∩)O
題2:有理逼近(jzoj1548)
輸入
輸入文件的第一行為P、N,其中 P、N<30000。
輸出
輸出文件只有一行,格式為“X/Y U/V”。注意,答案必須是既約的,也就是說(shuō)分子、分母的最大公約數(shù)必須等于1。
樣例輸入
2 5
樣例輸出
4/3 3/2
暴枚好像會(huì)超時(shí),所以我們先枚舉分子,然后從中間開(kāi)始向兩邊擴(kuò)展的搜分母。
在這里感謝朋友提供思路,這里是他的博客:http://blog.csdn.net/sugar_free_mint
代碼
#include<cstdio> #include<cmath> #include<iostream> #include<algorithm> using namespace std; double p,s1,s2,ss1,ss2,j,k; int w,n,u; int main() {//freopen("rational.in","r",stdin);//freopen("rational.out","w",stdout);scanf("%d%d",&w,&n);p=sqrt(w);//開(kāi)方u=n/p;//確定中間值s1=-214748364;s2=1;ss1=214748364;ss2=1;//初始化for (double i=1;i<=n;i++){j=u;k=0;while (j+k<=n && j-k>=1){if (p-i/(j+k)>0 && p-i/(j+k)<p-s1/s2)//判斷{s1=i;s2=(j+k);}if (p-i/(j-k)>0 && p-i/(j-k)<p-s1/s2){s1=i;s2=(j-k);}if (i/(j+k)-p>0 && i/(j+k)-p<ss1/ss2-p){ss1=i;ss2=(j+k);}if (i/(j-k)-p>0 && i/(j-k)-p<ss1/ss2-p){ss1=i;ss2=(j-k);}k++;}//擴(kuò)展}s1=int(int(s1)/__gcd(int(s1),int(s2)));s2=int(int(s2)/__gcd(int(s1),int(s2)));//約分ss1=int(int(ss1)/__gcd(int(ss1),int(ss2)));ss2=int(int(ss2)/__gcd(int(ss1),int(ss2)));//約分printf("%.lf/%.lf %.lf/%.lf",s1,s2,ss1,ss2);//輸出 }題目3:活動(dòng)安排(jzoj1549)
有n (n<=100) 個(gè)活動(dòng),每個(gè)活動(dòng)開(kāi)始時(shí)間si,結(jié)束時(shí)間fi。每個(gè)活動(dòng)需要一個(gè)會(huì)場(chǎng),求需要的最小會(huì)場(chǎng)數(shù)。水題。
輸入
第一行是活動(dòng)數(shù)n(1≤n≤100)。
以后的n行,每行兩個(gè)整數(shù),分別表示n個(gè)活動(dòng)的開(kāi)始時(shí)間si和結(jié)束時(shí)間fi(1≤i≤n),si
輸出
一個(gè)整數(shù),表示需要的最少會(huì)場(chǎng)數(shù)。
樣例輸入
4
1 8
2 5
7 15
5 9
樣例輸出
3
判斷當(dāng)前有沒(méi)有空的會(huì)場(chǎng),如果有就把活動(dòng)安排進(jìn)去,不然就開(kāi)一個(gè)新的。
代碼
#include<cstdio> using namespace std; int s[101],f[101],n,t,w,wf[101]; int main() {//freopen("meet.in","r",stdin);//freopen("meet.out","w",stdout);scanf("%d",&n);for (int i=1;i<=n;i++) scanf("%d%d",&s[i],&f[i]);for (int i=1;i<n;i++)for (int j=i+1;j<=n;j++)if (s[i]>s[j]){t=s[i];s[i]=s[j];s[j]=t;t=f[i];f[i]=f[j];f[j]=t;}//看我連快排都懶得用了for (int i=1;i<=n;i++){for (int j=1;j<=w;j++)if (s[i]>=wf[j])//有空會(huì)場(chǎng){wf[j]=f[i];f[i]=-1;break;}if (f[i]!=-1)//安排新會(huì)場(chǎng){w++;wf[w]=f[i];//活動(dòng)結(jié)束時(shí)間}}printf("%d",w);//輸出 }題目4:最小步數(shù)(jzoj1550)
一條路長(zhǎng)n,每走到一個(gè)格會(huì)獲得Ai元(-10000<=Ai<=10000),你也可以選擇花100元跳過(guò)該格,金幣不可以為負(fù)數(shù)。求到終點(diǎn)最小的步數(shù)
輸入
共有兩行。
第一行為整數(shù)N(0<=N<=100)。
第二行有N個(gè)整數(shù),第K個(gè)數(shù)為A[K],-10000<=A[K]<=10000,。
輸出
一個(gè)整數(shù),表示需要走的最少步數(shù)。若無(wú)法走到終點(diǎn),輸出-1。
樣例輸入
6
30 30 30 30 30 30
樣例輸出
5
這里dp,其實(shí)記搜也可以過(guò)(不過(guò)不重要)。然后用f[i][j]來(lái)表示到達(dá)第i格用j步并且最后一步是跳過(guò)的最大金幣,然后用f[i][j]來(lái)表示到達(dá)第i格用j步并且最后一步是走過(guò)的最大金幣。
動(dòng)態(tài)轉(zhuǎn)移方程:f[i][j]=max(f[i-1][j],f2[i-1][j])-100 (跳過(guò)該步)
f2[i][j]=max(f[i-1][j-1],f2[i-1][j-1])+a[i] (走過(guò)該步)
代碼
#include<cstdio> #include<iostream> using namespace std; int a[101],f[101][101],n,ans,f2[101][101]; int main() {//freopen("steps.in","r",stdin);//freopen("steps.out","w",stdout);scanf("%d",&n);for (int i=1;i<=n;i++){scanf("%d",&a[i]);} for (int i=1;i<=n;i++)for (int j=0;j<=i;j++) {f2[i][j]=-214748364;f[i][j]=-214748364;}//初始化 for (int i=1;i<=n;i++){for (int j=1;j<=i;j++){if (max(f[i-1][j],f2[i-1][j])-100>=0 && i!=n) f[i][j]=max(f[i-1][j],f2[i-1][j])-100;//跳if (max(f[i-1][j-1],f2[i-1][j-1])+a[i]>=0) f2[i][j]=max(f[i-1][j-1],f2[i-1][j-1])+a[i];//走}}for (int i=0;i<=n;i++) if (f2[n][i]>=0) {printf("%d",i);return 0;}//查找printf("-1");//不能到達(dá) }總結(jié)
以上是生活随笔為你收集整理的【jzoj】2018.1.31 NOIP普及组——D组模拟赛的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 【jzoj】2018.1.30NOIP普
- 下一篇: 【jzoj3734,Usaco2014O