A. Strange Partition
题意:求最小和最大的bi/x向上取整的和。
题解: 最小n个数的和作为一个数除以x,最大n个数分别除以x。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int a[100010];
int main()
{
int t, n, x, i;cin >> t;
while (t--){
ll sum = 0, mx = 0, mi = 0;
cin >> n >> x;
for (i = 0; i < n; i++){
cin >> a[i], sum += a[i];
if (a[i] % x) mx++;
mx += a[i] / x;
}
if (sum % x) mi++;
mi += sum / x;
cout << mi << ' ' << mx << endl;
}
}
B.Strange List
题意:设当前数为q,如果q能被x整除,在序列末端插入x个q/x,q移到下一位元素重复以上操作,如果不能就结束操作。求序列最终的和。
题解:插入x个q/x就是加q,只要q能被x整除就加q,一直到出现一个不能被x整除的数为止。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int a[100010], b[100010];
int main()
{
ll t, n, x, i;cin >> t;
while (t--){
int flag = 0;
ll sum = 0;
cin >> n >> x;
for (i = 0; i < n; i++)
cin >> a[i], b[i] = a[i], sum += a[i];
while (1){
for (i = 0; i < n; i++){
if (b[i] % x){
flag = 1;
break;
}
sum += a[i], b[i] /= x;
}
if (flag) break;
}
cout << sum << endl;
}
}
C. Strange Birthday Party
题意:p有n位朋友,每位朋友有一个数ki。商店有m份礼物,第j份礼物价值cj美元,每份礼物只能买一次。当j<=ki时,p要么给第i位朋友价值为cj的礼物,要么直接给cki美元。问最小花费。
题解:注意c序列升序。对k序列降序处理,k值大的先选,避免较小的k值拿走较小的c值,最小值从c1开始,每次和cki比较取较小值。
#include<bits/stdc++.h>
using namespace std;
int k[300010], c[300010];
int main()
{
int t, n, m, i, j;cin >> t;
while (t--){
long long sum = 0;
cin >> n >> m;
for (i = 1; i <= n; i++)
cin >> k[i];
for (i = 1; i <= m; i++)
cin >> c[i];
sort(k + 1, k + n + 1);
int pn = 0;
int mi = c[++pn];
for (i = n; i >= 1; i--){
if (mi < c[k[i]]) sum += mi, mi = c[++pn];
else sum += c[k[i]];
}
cout << sum << endl;
}
}