【jzoj】2018/2/2 NOIP普及组——D组模拟赛
前言
今天五道題,難度做起來感覺很難,其實就是紙老虎233。
正題
題目1:公牛數學(jzoj1896)
就是高精乘
輸入
第1..2行:每行包含一個十進制數
輸出
第1行:輸出兩個數乘積
樣例輸入
11111111111111
1111111111
樣例輸出
12345679011110987654321
解題思路
高精度不講
代碼
#include<cstdio> #include<string> #include<iostream> using namespace std; int a1[51],a2[51],a[251],n1,n2,g,w; void read() {string s1,s2;cin>>s1>>s2;n1=s1.size();n2=s2.size();for (int i=1;i<=n1;i++) {a1[i]=s1[n1-i]-48;}for (int j=1;j<=n2;j++) {a2[j]=s2[n2-j]-48;} } void cons() {for (int i=1;i<=50;i++){for (int j=1;j<=50;j++){a[i+j-1]+=a1[i]*a2[j]+g;g=a[i+j-1]/10;a[i+j-1]%=10;}} } void write() {w=200;while (a[w]==0) w--;for (int i=w;i>=1;i--){printf("%d",a[i]);} } int main() {//freopen("bullmath.in","r",stdin);//freopen("bullmath.out","w",stdout);read();cons();write(); }題目2:憤怒的牛(jzoj1897)
有n個不同距離的牛棚,要放入c只牛,使它們之間的最小距離最大。
輸入
第1行:兩個用空格隔開的數字N和C。
第2~N+1行:每行一個整數,表示每個隔間的坐標。
輸出
輸出只有一行,即相鄰兩頭牛最大的最近距離。
樣例輸入
5 3
1
2
8
4
9
樣例輸出
3
解題思路
用二分法查找答案,用貪心來判斷
代碼
#include<cstdio> #include<iostream> #include<algorithm> using namespace std; int n,c,a[100001],l,r,k,sum,mins,mid; int main() {//freopen("aggr.in","r",stdin);//freopen("aggr.out","w",stdout);scanf("%d%d",&n,&c);for (int i=1;i<=n;i++) scanf("%d",&a[i]);sort(a+1,a+1+n);//排序l=0;r=a[n];//范圍while (l<=r){mid=(l+r)/2;//二分sum=1;//放入1k=1;//記錄上一頭牛for (int i=2;i<=n;i++){if (a[i]-a[k]>=mid)//如果距離夠{sum+=1;//放牛k=i;//記錄}}if (sum<c) r=mid-1;else l=mid+1;//二分}printf("%d",l-1); }題目3:約數和(jzoj1401)
輸入T組數據,然后輸入n,求它的所有約數和。
輸入
本題有多組數據,第一行一個T,表示有T組數據,下面T行,每行一個正整數N表示要處理的數。
輸出
T行,每行一個正整數表示輸入中對應的數的約數和。
樣例輸入
1
12
樣例輸出
28
解題思路
用開方優化求約數的枚舉過程,用f數組記錄重復的
代碼
#include<cstdio> #include<algorithm> #include<cmath> using namespace std; int x,s,t,w,f[5000001]; int main() {scanf("%d",&t);for (int ti=1;ti<=t;ti++){scanf("%d",&x);if (f[x]!=0) printf("%d\n",f[x]);//輸出else{s=0;w=int(sqrt(double(x)));//優化for (int i=1;i<=w;i++){if (x%i==0) {s+=i;//累加if (x/i!=i)s+=x/i;//去重}}printf("%d\n",s);f[x]=s;//記錄}} }題目4:旅行(jzoj1402)
一條7000km的路上已經知道有若14個旅館,分別距離原點
0, 990, 1010, 1970, 2030, 2940, 3060, 3930, 4060, 4970, 5030, 5990, 6010, 7000
還加入了n個旅館,一輛車每天至少走a km,最多走b km,求旅行方案總數。
輸入
第一行輸入A,第二行輸入B,第三行輸入N(0<=N<=20),表示在出發之前又新增N個汽車旅館,接下來N行,每行一個整數m,表示旅館離起點的距離(0
輸出
輸出一共有多少種旅行方案。
樣例輸入
1
500
0
樣例輸出
0
解題思路
這里用dp,如果可以加入就累加方案數
#include<cstdio> #include<algorithm> using namespace std; int a,b,n,f[41],s; int way[41]={0,0,990,1010,1970,2030,2940,3060,3930,4060,4970,5030,5990,6010,7000}; //預處理 int main() {scanf("%d%d%d",&a,&b,&n);n+=14;for (int i=15;i<=n;i++) scanf("%d",&way[i]);sort(way+1,way+1+n);//快排f[1]=1; for (int i=2;i<=n;i++){for (int j=1;j<i;j++){if (way[i]-way[j]>=a && way[i]-way[j]<=b){f[i]+=f[j];//dp}}}for (int i=1;i<=n;i++) if (way[i]+b>=7000) s+=f[i];//累加可以到達賓館的方案printf("%d",f[n]);//輸出 }
題目5:逆序統計(1403)
給出n個數字,求出逆序對為k的排列數。
輸入
從文件COUNT.IN輸入。輸入第一行有兩個整數N 和K。其中(N<=100,K<=N*(N-1)/2)
輸出
將1..N 的逆序對數量為K的特定排列的數量輸出到文件COUNT.OUT。為了避免高精度計算,請將結果mod 10000以后再輸出!
樣例輸入
5 3
樣例輸出
15
解題思路
從兩個方向[i][j-1],[i-1][j],然后減去重復
代碼
#include<cstdio> using namespace std; int n,k,f[101][4951]; int main() {scanf("%d%d",&n,&k);f[0][0]=1;//初始化for (int i=1;i<=n;i++)for (int j=0;j<=k;j++)if(j)//避免越界{if (i>j) f[i][j]=(f[i-1][j]+f[i][j-1])%10000;//動態轉移else f[i][j]=(f[i-1][j]+f[i][j-1]-f[i-1][j-i])%10000;//動態轉移}else f[i][j]=f[i-1][j];f[n][k]=(f[n][k]+10000)%10000;//避免負數printf("%d",f[n][k]); }總結
以上是生活随笔為你收集整理的【jzoj】2018/2/2 NOIP普及组——D组模拟赛的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 封顶大吉祝贺词 听起来喜气的句子
- 下一篇: 三更半夜的三更指的是几点 三更半夜中的三