Codeforces Round 922 (Div. 2) A~B

Codeforces Round 922 (Div. 2)

A. Brick Wall

题目大意:在一块n*m的砖墙内放置若干块1×k规格的砖块(k≥2),要求填满砖墙且不能超出,现要求横放的砖块数量减竖放的砖块数量最大是多少。
思路:要注意宽和高是固定好的,n是高,m是宽,要求横放的尽可能多,竖放的尽可能少,就分情况来考虑,m(宽)是偶数:一行上放满1×2规格的砖块,再乘高即可。m是奇数:一行上最后一个放1×3,前面都放1×2,再乘高。

AC 代码

#include<stdio.h>
int main()
{
	int t;
	scanf("%d", &t);
	while (t > 0)
	{
		int sum = 0;
		int a, b;
		int c = 0;
		scanf("%d %d", &a, &b);
		if (b % 2 == 0)
		{
			c = b / 2;
			sum = c * a;
		}
		else
		{
			c= (b - 1) / 2;
			sum = c * a;
		}
		printf("%d\n", sum);
		t--;
	}
	return 0;
}

B. Minimize Inversions

题目大意:两个数,在前面的那个数比在后面的那个数大,就称这对数为逆序对,现给你两个从1到n的两个数列,要求同时移动两个数列相同位置上的数和其他位置上的数交换,使得重新排列后的两个数列的逆序对的数量最少。

解法一:

思路:从前往后两两比较(即第一个比第二个,再比第三、四、五个,完了再从第二个开始比第三个,第四个,以此类推),如果两个数列的数都比后面的数小就不动,都比后面的大就交换位置,一大一小就选一列排成升序。

AC 代码

#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
struct NN {
	int a, b;
}arr[200005];
bool cmp(struct NN A,struct NN B)
{
	if (A.a < B.a and A.b < B.b) {
		return true;
	}
	else if (A.a > B.a and A.b > B.b) {
		return false;
	}
	else return A.a < B.a;
}
int main()
{
	int t;
	scanf("%d", &t);
	while (t > 0)
	{
		int n;
		scanf("%d", &n);

		for (int i = 0; i < n; i++)
		{
			scanf("%d", &arr[i].a);//输入数列一的值

		}
		for (int i = 0; i < n; i++)
		{

			scanf("%d", &arr[i].b);//输入数列二的值
		}
		sort(arr, arr + n, cmp);//调用sort函数进行排序
		for (int i = 0; i < n; i++)
		{
			printf("%d ", arr[i].a);//输出数列一的值

		}
		printf("\n");
		for (int j = 0; j < n; j++)
		{
			printf("%d ", arr[j].b);//输出数列二的值

		}
		printf("\n");
		t--;
	}
	return 0;
}

代码分析

struct NN {
	int a, b;
}arr[200005];

这里用了结构体数组来存储两行数列,a存第一个数列的值,b存第二个

bool cmp(struct NN A,struct NN B)
{
	if (A.a < B.a and A.b < B.b) {//第一个条件
		return true;
	}
	else if (A.a > B.a and A.b > B.b) {//第二个条件
		return false;
	}
	else return A.a<B.a;//第三个条件,这个地方用A.b<B.b也可以
}

这里是后面sort函数要用到的排序方法,即如果两个数列都是升序就不动,都是降序就调换位置,一大一小就任选一列排成升序。

解法二:

思路:只要任选一个数列将其排成升序即可,即将任意一行数列排成一个逆序对也没有,整体逆序对数量就是最少的。

  • 6
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

韬. .

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值