C++GESP四级真题讲解

 

B4005 [GESP202406 四级] 黑白方块

题目描述

小杨有一个 n 行 m 列的网格图,其中每个格子要么是白色,要么是黑色。对于网格图中的一个子矩形,小杨认为它是平衡的当且仅当其中黑色格子与白色格子数量相同。小杨想知道最大的平衡子矩形包含了多少个格子。

输入格式

第一行包含两个正整数 n,m,含义如题面所示。

之后 n 行,每行一个长度为 m 的 0101 串,代表网格图第 i 行格子的颜色,如果为 00,则对应格子为白色,否则为黑色。

输出格式

输出一个整数,代表最大的平衡子矩形包含格子的数量,如果不存在则输出 00。

输入输出样例

输入 

4 5
00000
01111
00011
00011

输出 

16
#include <bits/stdc++.h>
using namespace std;
char a[15][15];
int ans=0;
bool check(int a2,int b2,int a1,int b1){
	int w=0,b=0;
	for(int i=a2;i<=a1;i++){
		for(int j=b2;j<=b1;j++){
			a[i][j]=='0' ? w++:b++;
		}
	}
	return w==b;
}
int main() { 
	int n,m;
	cin>>n>>m;
	for(int i=1;i<=n;i++)
		for(int j=1;j<=m;j++)
			cin>>a[i][j];
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){ //(i,j)作为 左上角肚坐标 
			for(int k=i;k<=n;k++){
				for(int l=j;l<=m;l++){//(k,l)作为右下角肚坐标 
					if(check(i,j,k,l)==1)//检测当前矩阵是否平衡 
						ans=max(ans,(k-i+1)*(l-j+1));
				}
			}
		}
	}
	cout<<ans;
	return 0;
}

 B4006 [GESP202406 四级] 宝箱

题目描述

小杨发现了 n 个宝箱,其中第 i 个宝箱的价值是 ai​。

小杨可以选择一些宝箱放入背包并带走,但是小杨的背包比较特殊,假设小杨选择的宝箱中最大价值为 x,最小价值为 y,小杨需要保证x−y≤k,否则小杨的背包会损坏。

小杨想知道背包不损坏的情况下,自己能够带走宝箱的总价值最大是多少。

输入格式

第一行包含两个正整数 n,k,含义如题面所示。

第二行包含 n 个正整数 1,2,…,a1​,a2​,…,an​,代表宝箱的价值。

输出格式

输出一个整数,代表带走宝箱的最大总价值。

输入输出样例

输入

5 1
1 2 3 1 2

输出

7

方法1(双指针):

#include <bits/stdc++.h>
using namespace std;
long long n,k,s[1005],a[1005],ans=0;
int main() { 
	cin>>n>>k;
	for(int i=1;i<=n;i++) cin>>a[i];
	sort(a+1,a+n+1);
	for(int i=1;i<=n;i++) s[i]=s[i-1]+a[i];
	int l=1,r=n;
	while(l<=r){
		while(a[r]-a[l]>k) r--;
		ans=max(ans,s[r]-s[l-1]);
		l++,r=n;
	}
	cout<<ans;
	return 0;
}

方法二(暴力枚举) :

#include <bits/stdc++.h>
using namespace std;
long long n,k,s[1005],a[1005],ans=0;
int main() { 
	cin>>n>>k;
	for(int i=1;i<=n;i++) cin>>a[i];
	sort(a+1,a+n+1);
	for(int i=1;i<=n;i++) s[i]=s[i-1]+a[i];
	for(int i=1;i<=n;i++){
		for(int j=i;j<=n;j++){
			if(a[j]-a[i]<=k) ans=max(ans,s[j]-s[i-1]); 
		}
	}
	cout<<ans;
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值