B
比赛的时候一直被C搞,通过看榜,以为C更好过,结果还写dfs,也不知道自己写的dfs到底哪里错了,连样例都过不了。赛后补题的时候,B题自己补出来了,就是整个
n
∗
m
n*m
n∗m矩形最终分割成
1
∗
3
1*3
1∗3或者
3
∗
1
3*1
3∗1的矩形最合适,但是还有一个条件,就是不能分成
1
∗
1
1*1
1∗1的矩形。这个注意一下就行了。
#include <bits/stdc++.h>
using namespace std;
#define T int T; scanf("%d", &T); while(T--)
int main()
{
T{
int n, m, ans;
scanf("%d%d", &n, &m);
if(n<m)
swap(n, m);
if(n%3==0){
ans=n/3*m;
} else if(m%3==0){
ans=m/3*n;
} else {
ans=(n/3)*m;
int a=n%3;
if(a==1){
ans+=m/3;
if(m%3)
ans+=1;
} else {
ans+=m/3*2;
int b=m%3;
ans+=b;
}
}
printf("%d\n", ans);
}
return 0;
}
C
看了这道题目,发现自己的脑子太死了。似乎很久没有从遍历数组的值得角度出发去做题(当然这道题目的范围很小),也没有通过将输入的数字进行偏移,便于数组存储。已经习惯暴力地使用unordered_map或map。
这道题目就是贪心的想法,将b[i]的值分为a[i-1](优先分为这个,使得尽可能多的数字参与变化)与a[i]。
#include <bits/stdc++.h>
using namespace std;
#define T int T; scanf("%d", &T); while(T--)
const int N=205;
int a[N], b[N];
int main()
{
T{
memset(a, 0, sizeof a);
memset(b, 0, sizeof b);
int n, x;
scanf("%d", &n);
for(int i=1; i<=n; i++){
scanf("%d", &x);
a[x+101]+=1;
}
for(int i=1; i<=n; i++){
scanf("%d", &x);
b[x+101]+=1;
}
bool flag=true;
for(int i=1; i<=201; i++){
if(b[i]==0)
continue;
if(a[i-1])
b[i]-=a[i-1];
if(b[i]>0){
if(b[i]<=a[i]){
a[i]-=b[i];
b[i]=0;
continue;
} else {
flag=false;
break;
}
}
}
if(flag){
printf("YES\n");
} else {
printf("NO\n");
}
}
return 0;
}