思路
如果一条边的方格数小于n-1,则不会对其他边产生影响,所以只需要判断n和n-1的情况,根据每条边对其他边的影响判断每条边最终需要满足的条件,如果无影响,目标大于等于0即可;
所以需要解决的问题是n-1和n对其他边产生的影响是什么,如果一条边的方格数为n,则该边对相邻两条边的影响为1,所以相邻两条边的目标数分别加1;如果是n-1,则该边对相邻两条边的总影响为1,所以需要判断两条边中哪一条可以承受影响的程度大,即该边方格数-该边目前的目标值,令两边该值大的边的目标数加1;最后遍历四条边方格数与目标值的关系即可。(提供另一种思路,开始看题的时候没想到二进制枚举,不甘心想了这么久的思路就这么沉了,有点呆hhhhh)
C++ 代码
#include<iostream>
#include<cstring>
using namespace std;
int main(void){
int T;
cin>>T;
while(T--){
int n;
cin>>n;
int num[4],sum[4];
memset(sum,0,sizeof(sum));
for(int i=0;i<4;i++) cin>>num[i];
for(int i=0;i<4;i++){
if(num[i]==n){
sum[i^1]++;
sum[i^3]++;
}
else if(num[i]==n-1){
if(num[i^1]-sum[i^1]>num[i^3]-sum[i^3]){
sum[i^1]++;
}
else sum[i^3]++;
}
}
int t=1;
for(int i=0;i<4;i++){
if(num[i]<sum[i]){
printf("NO\n");
t=0;
break;
}
}
if(t) printf("YES\n");
}
return 0;
}
思路好强
问号
tql ORZ