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;
}