B. Inflation
题意:你要提高p[] 数组中的数,使每次的通货膨胀率不超过k,要求改变的总量最少。
我们如果提高p[i], 那么下标小于i的通货膨胀率不变,下标为i的通货膨胀率提高,大于i的减少,最优情况肯定不能有提高出现,所以我们只提高p[1]的值。
学了个向上取整的方法,额外加个k - 1.
学了个转成long long 的写法 1 long long。
#include <bits/stdc++.h>
using namespace std;
typedef long long li;
int t, n, k;
int p[110];
int main()
{
cin >> t;
while (t -- )
{
scanf("%d%d", &n, &k);
for (int i = 1; i <= n; i ++ ) scanf("%d", &p[i]);
li x = 0;
li pSum = p[1];
for (int i = 2; i <= n; i ++ )
{
x = max(x, (100ll * p[i] - k * pSum + k - 1) / k);
pSum += p[i];
}
printf("%lld\n", x);
}
return 0;
}
这个乱搞的代码居然也过了
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int t, n, k;
int p[110];
ll pre[110];
int main()
{
cin >> t;
while (t -- )
{
scanf("%d%d", &n, &k);
for (int i = 1; i <= n; i ++ ) scanf("%d", &p[i]);
for (int i = 1; i <= n; i ++ ) pre[i] = pre[i - 1] + p[i];
ll sum = 0;
for (int i = n; i >= 2; i -- )
{
if (p[i] * 1.0 / (pre[i - 1] + sum) > k * 1.0 /100)
sum += ceil(100.0 / k * p[i] - pre[i - 1] - sum);
}
printf("%lld\n", sum);
}
return 0;
}
C. Ball in Berland
题意:给定能一起跳舞的男和女,你可以抽出男和女都不一样的两组,统计一共有几种可能性。
代码先沾上,补高数作业了
按官方解法打的
来补题解了,官方的意思大概是遍历每一个组,当前组能与其他组匹配的数量为总数减去男生重复的数量和女生重复的数量,因为当前组减了两次,所以要加1。因为每种情况都加了两次,所以最后要除2。
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> PII;
const int N = 200010;
int t, a, b, k;
int visa[N], visb[N];
vector<int> A(N), B(N);
int main()
{
cin >> t;
while (t -- )
{
scanf("%d%d%d", &a, &b, &k);
memset(visa, 0, sizeof visa);
memset(visb, 0, sizeof visb);
for (int i = 1; i <= k ; i ++ )
{
scanf("%d", &A[i]);
++ visa[A[i]];
}
for (int i = 1; i <= k ; i ++ )
{
scanf("%d", &B[i]);
++ visb[B[i]];
}
ll ans = 0;
for (int i = 1; i <= k; i ++ )
{
ans += k - visa[A[i]] - visb[B[i]] + 1;
}
cout << ans / 2 << endl;
}
return 0;
}
自己乱搞的,我先求如果一个都不重复的总的匹配数量,首项为1,末项为k - 1的等差数列,同理,分别统计出男女生重复的数量,求两个等差数列,总数减去他们即是答案。
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 200010;
ll A[N], B[N], C[N], D[N];
int t, a, b, k;
// 等差数列求和
ll cal(ll x)
{
return (x - 1) * x / 2;
}
int main()
{
cin >> t;
while (t -- )
{
scanf("%d%d%d", &a, &b, &k);
ll sum = cal(k);
memset(D, 0, sizeof D);
memset(C, 0, sizeof C);
for (int i = 1; i <= k; i ++ ){
scanf("%lld", &A[i]);
C[A[i]] ++;
}
for (int i = 1; i <= k; i ++ ){
scanf("%lld", &B[i]);
D[B[i]] ++;
}
for (int i = 1; i <= max(a, b); i ++ )
{
if (C[i] > 1) sum -= cal(C[i]);
if (D[i] > 1) sum -= cal(D[i]);
}
printf("%lld\n", sum);
}
return 0;
}