筆試題整理

2021-10-22 17:43:30 字數 2571 閱讀 3315

n副撲克,張數為m,大小為1~m,每幅撲克抽一張,求和恰好為k的組合數,結果對10e9+7取餘數。

思路:動態規劃。和為i,j副撲克,,dp[i][j] = dp[i-1][j-1]+...+dp[i-m][j-1](此處需要判斷 i-m>0 )。初始化,j=1,i<=m,dp[i][j] = 1; i==j,dp[i][j] = 1,後面的情況不可能存在,所以推出迴圈。

public class main 

}public static int solution(int m, int n, int k) else if (j == 1) else }}

}return (int) (dp[k][n] % mod);

}}

第一題 o(n*m*k) 二維dp

第二題 o(nlogn) sort+字首和

資料規模:n, m < 100000, 暴力o(n^2)顯然超時,所以我們得考慮nlogn或者線性演算法才能ac

1. 我們選擇一組零件(i,j) 應該是 選擇min(a[i]+b[j], a[j]+b[i])作為當前組合的不穩定性

2. 那麼由1可知當 a[i]+b[j] < a[j]+b[i] 時,應該選擇左邊的組合,移項得a[i]-b[i] < a[j] - b[j],移項的想法是如何得到度量零件本身的屬性

3. 對所有零件以key=a[i]-b[i]進行排序得到新的順序s,那麼排序後,對於零件i,它與左邊的零件組合,它自身應該選擇b[i],與右邊的零件組合,它自身選擇a[i]

4. 所以有ans[i] = b[i] * (i-1) + a[i] * (n-i) + sum_a[1...i-1] + sum_b[i+1...n]

5. 至於零件衝突,在輸入的時候ans[x]和ans[y]都減去min(a[x]+b[y], a[y]+b[x])即可

6. 排序時間複雜度排序o(nlogn),字首和處理時間和計算ans時間為o(n),零件衝突處理o(m)

#include #include #include const int n = 100005;

int n, m;

int a[n], b[n], id1[n], id2[n];

int u[n], v[n];

int p;

long long suma, sumb, ans[n];

bool cmp1(int x, int y)

bool cmp2(int x, int y)

int main()

for (int i = 0; i < m; ++i)

for (int i = 0; i < m; ++i)

m <<= 1;

std::sort(id1, id1 + n, cmp1);

std::sort(id2, id2 + m, cmp2);

// for (int i = 0; i < n; ++i)

// printf("%d\n", id1[i]);

p = 0;

suma = 0;

for (int i = 1; i < n; ++i)

// printf("%lld\n", sumb);

for (int i = 0; i < n; ++i)

else

}while (u[id2[pos]] == idx1)

// if (idx1 == 2)

// printf("%lld\n", ans[idx1]);

// printf("%d %lld %lld\n", idx1, suma, sumb);

ans[idx1] += suma;

ans[idx1] += sumb;

ans[idx1] += b[idx1] * i;

ans[idx1] += a[idx1] * (n - i - 1);

suma += a[idx1];

sumb -= b[id1[i + 1]];

} for (int i = 0; i < n; ++i)

printf("%lld\n", ans[i]);

return 0;

}

#include#include#includeusing namespace std;

int main()

vectorans(n, sup);

for (int i = 0; i < n; ++i)

ans[i] += n * b[i];

sort(del.begin(), del.end());

vectorsum(n + 1, 0);

for (int i = 0; i < n; ++i)

sum[i + 1] = sum[i] + del[i];

for (int i = 0; i < n; ++i)

for (int i = 0; i < m; ++i)

for (int i = 0; i < n; ++i)

cout << ans[i] << " ";

return 0;

}

C 筆試題整理

1.已知string類定義如下 class string 嘗試寫出類的成員函式實現。答 string string const char str else string string const string another string string operator const string r...

最近筆試題整理

已知資料表a中每個元素距其最終位置不遠,為了節省時間,應該採取的演算法是 a.直接選擇排序 b.直接插入排序 c.堆排序 d.快速排序 當元素基本有序時,插入排序的排序時間在o n 選b直接選擇排序 straight select sorting 也是一種簡單的排序方法,它的基本思想是 第一次從r ...

筆試題整理 1

一 簡述陣列與指標的區別?陣列要麼在靜態儲存區被建立 如全域性陣列 要麼在桟上被建立 指標可以隨時指向任意型別的記憶體塊 1 修改內容上的差別 char a hello a 0 x char p world p 0 x 指標p指向字串常量 不能修改 2 用運算子 sizeof 可以計算陣列的位元組數...