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 可以計算陣列的位元組數...