2021-03-16每日两题

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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值