文章目录
A. Upload More RAM
Problem
你每秒都可以上传0GB或1GB的内存,但是每 k k k 秒最多上传1GB的内存。
问将 n n n GB的内存全部上传需要的最短时间。
数据范围: 1 ≤ n , k ≤ 100 1 \leq n,k \leq 100 1≤n,k≤100
Solution
最优的方案是第一秒的时候上传1GB,之后每 k k k 秒上传1GB。答案即为 ( n − 1 ) × k + 1 (n-1)\times k+1 (n−1)×k+1
时间复杂度: O ( 1 ) O(1) O(1)
Code
void solve()
{
cin >> n >> k;
printf("%d\n", (n - 1) * k + 1);
}
B. K-Sort
Problem
给定一个数组 { a } i = 1 n \{a\}_{i=1}^n { a}i=1n,每次可以花费 k + 1 k+1 k+1 枚硬币,从数组中选取 k k k 个元素,并执行 a i = a i + 1 a_i=a_i+1 ai=ai+1 。
问最少需要多少枚硬币,使得数组 { a } i = 1 n \{a\}_{i=1}^n { a}i=1n 是非递减。
数据范围: 1 ≤ n ≤ 1 0 5 , 1 ≤ a i ≤ 1 0 9 1\leq n \leq 10^5,1\leq a_i \leq 10^9 1≤n≤105,1≤ai≤109
Solution
假设数组 { b } i = 1 n \{b\}_{i=1}^n { b}i=1n 是得到的非递减数组,那么 b i b_i bi就是原数组前缀中最大的元素,可以通过 b i = m a x ( b i − 1 , a i ) b_i=max(b_{i-1},a_i) bi=max(bi−1,ai) 得到。那么每个位置需要执行的操作次数为 d i = b i − a i d_i=b_i-a_i di=bi−ai,将其记为数组 { d } i = 1 n \{d\}_{i=1}^n { d}i=1n,并对其进行从小到大的排序。
答案即为 a n s = ∑ ( d i − d i − 1 ) × ( n − i + 1 ) ans=\sum (d_i-d_{i-1})\times (n-i+1) ans=∑(di−di−1)×(n−i+1),其中 d i − d i − 1 d_i-d_{i-1} di−di−1为需要重复的次数, n − i + 1 n-i+1 n−i+1为每次操作需要的硬币。
时间复杂度: O ( n l o g n ) O(n\ log\ n) O(n log n)
Code
void solve()
{
cin >> n;
for (int i = 1; i <= n; i++)
{
cin >> a[i];
}
int ma = a[1]<

最低0.47元/天 解锁文章
557

被折叠的 条评论
为什么被折叠?



