宣告:以下答案僅代表個人答案,不保證正確,如有蒙對,萬分榮幸
填空目錄
- 試題 A: 空間
- 題目
- 決議
- 試題 B: 卡片
- 題目
- 決議
- 試題 C: 直線
- 題目
- 決議
- 試題 D: 貨物擺放
- 題目
- 決議
- 試題 E: 路徑
- 題目
- 決議
試題 A: 空間
題目
【問題描述】
小藍準備用 256MB 的記憶體空間開一個陣列,陣列的每個元素都是 32 位
二進制整數,如果不考慮程式占用的空間和維護記憶體需要的輔助空間,請問
256MB 的空間可以存盤多少個 32 位二進制整數?
決議
答案:67108864
1MB=1024kb
1kb=1024b
1b=8byte
1位即是1byte
ans=256*1024*1024*8/32=67108864
試題 B: 卡片
題目
【問題描述】
小藍有很多數字卡片,每張卡片上都是數字 0 到 9,
小藍準備用這些卡片來拼一些數,他想從 1 開始拼出正整數,每拼一個,
就保存起來,卡片就不能用來拼其它數了,
小藍想知道自己能從 1 拼到多少,
例如,當小藍有 30 張卡片,其中 0 到 9 各 3 張,則小藍可以拼出 1 到 10,
但是拼 11 時卡片 1 已經只有一張了,不夠拼出 11,
現在小藍手里有 0 到 9 的卡片各 2021 張,共 20210 張,請問小藍可以從 1
拼到多少?
提示:建議使用計算機編程解決問題,
決議
答案:3181
直接編程:
#include<bits/stdc++.h>
using namespace std;
using namespace std;
int cnt[10];
int main() {
int n=2021,i,x,k=1;
for(i=0;i<10;i++)cnt[i]=n;
while(1){
x=k;
while(x){
if(cnt[x%10]>0)cnt[x%10]--,x/=10;
else break;
}
if(x)break;
else k++;
}
cout<<k-1<<endl;
return 0;
}
運行結果:

試題 C: 直線
題目
【問題描述】
在平面直角坐標系中,兩點可以確定一條直線,如果有多點在一條直線上,
那么這些點中任意兩點確定的直線是同一條,
給定平面上 2 × 3 個整點 {(x, y)|0 ≤ x < 2, 0 ≤ y < 3, x ∈ Z, y ∈ Z},即橫坐標
是 0 到 1 (包含 0 和 1) 之間的整數、縱坐標是 0 到 2 (包含 0 和 2) 之間的整數
的點,這些點一共確定了 11 條不同的直線,
給定平面上 20 × 21 個整點 {(x, y)|0 ≤ x < 20, 0 ≤ y < 21, x ∈ Z, y ∈ Z},即橫
坐標是 0 到 19 (包含 0 和 19) 之間的整數、縱坐標是 0 到 20 (包含 0 和 20) 之
間的整數的點,請問這些點一共確定了多少條不同的直線
決議
答案:47753
聽說是kb炸精度
直接編程,用y=kx+b把所有的直線存起來,最后加上20條斜率不存在的直線,
#include<bits/stdc++.h>
using namespace std;
using namespace std;
int cnt[10];
pair<double ,double>t;
map<pair<double ,double>,int>q;
int main() {
int x1,x2,y2,y1,n=20,m=21;
for(x1=0;x1<n;x1++){
for(x2=0;x2<n;x2++){
for(y1=0;y1<m;y1++){
for(y2=0;y2<m;y2++){
if(x1!=x2){
t.first=1.0*(y1-y2)/(x1-x2);
t.second=y1-t.first*x1;
q[t]++;
}
}
}
}
}
cout<<q.size()+n;
return 0;
}
運行結果:

聽說是kb炸精度
試題 D: 貨物擺放
題目
小藍有一個超大的倉庫,可以擺放很多貨物,
現在,小藍有 n 箱貨物要擺放在倉庫,每箱貨物都是規則的正方體,小藍
規定了長、寬、高三個互相垂直的方向,每箱貨物的邊都必須嚴格平行于長、
寬、高,
小藍希望所有的貨物最終擺成一個大的立方體,即在長、寬、高的方向上
分別堆 L、W、H 的貨物,滿足 n = L × W × H,
給定 n,請問有多少種堆放貨物的方案滿足要求,
例如,當 n = 4 時,有以下 6 種方案:1×1×4、1×2×2、1×4×1、2×1×2、 2 × 2 × 1、4 × 1 × 1,
請問,當 n = 2021041820210418 (注意有 16 位數字)時,總共有多少種
方案?
提示:建議使用計算機編程解決問題,
決議
涉及數學組合問題,
假設體積是V, 那么找出所有的質因子放進LWH三個位置,答案就是看有幾種放法,
質因子不同時:
比如6=2*3
那就是(2的放法)*(3的放法),即3*3=9,
質因子相同時:
我們可以看成下面這樣的問題:
假設現在有n個一樣的球,放進3個盒子(盒子可以不放球),求幾種放法,
解決:用擋板法,用兩個擋板把球隔開,這樣三個部分放進三個盒子,第一塊擋板有(n+1)種放法,第二塊擋板有(n+2)種放法,/2除去重復,所以就是(n+1)*(n+2)/2,
說明:4(兩個質因子2)
加粗的是第一塊擋板
第一塊擋板:(兩個因子下第一塊擋板三個放法,最左到最右)
① | 2 2,或者②2 | 2,或者③2 2 | ;
第二塊擋板:(兩個因子下+一塊擋板,第二塊擋板四個放法,最左到最右)
①的情況下:| | 2 2, | |2 2, | 2|2, | 2 2|
②的情況下:|2 | 2,2| | 2,2 || 2,2 | 2 |
③的情況下:|2 2 | ,2|2 | ,2 2| | ,2 2 | |
所以3*4=12
第一塊擋板放在a位置、第二塊擋板放在b位置 與 第一塊擋板放在b位置、第二塊擋板放在a位置相同,去重/2
4分成2^2,有3*4/2=6種放法,
找出2021041820210418所有因子,

所以ans=3*3*3*3*3*((3+1)*(3+2)/2)=243*10=2430
原始碼:
#include<bits/stdc++.h>
using namespace std;
using namespace std;
#define ll long long
map<ll,int>q;
int main() {
ll n= 2021041820210418,i;
for(i=2;i*i<=n;i++){
while(n%i==0){
q[i]++;
n/=i;
}
}
if(n!=1)q[n]++;
for(map<ll,int>::iterator it=q.begin();it!=q.end();it++){
cout<<it->first<<" :"<<it->second<<endl;
}
return 0;
}
試題 E: 路徑
題目
【問題描述】
小藍學習了最短路徑之后特別高興,他定義了一個特別的圖,希望找到圖
中的最短路徑,
小藍的圖由 2021 個結點組成,依次編號 1 至 2021,
對于兩個不同的結點 a, b,如果 a 和 b 的差的絕對值大于 21,則兩個結點
之間沒有邊相連;如果 a 和 b 的差的絕對值小于等于 21,則兩個點之間有一條
長度為 a 和 b 的最小公倍數的無向邊相連,
例如:結點 1 和結點 23 之間沒有邊相連;結點 3 和結點 24 之間有一條無
向邊,長度為 24;結點 15 和結點 25 之間有一條無向邊,長度為 75,
請計算,結點 1 和結點 2021 之間的最短路徑長度是多少,
提示:建議使用計算機編程解決問題,
決議
答案:10266837
dij不會寫
Floyd已經忘了
那就猜吧
從1到2021,那么我只要走得盡量少,且邊盡量短就好,
lcm(a,b)=a*b*gcd(a,b)
如果a!=b&&a>1&&b>1,那么gcd(a,b)肯定<=abs(a-b),所以gcd最大就是21,我讓gcd(a,b)始終保持21
取點1,21,42,63,84,… ,2016,2021
運行結果:
ans=10266837
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/278465.html
標籤:其他
