A - Palindromic Twist
水题:给你一段字符串,每个字符可以变成相邻的字母,问所有字符改变一次能不能形成回文串。
分析:所有串对称的两个字符要不相等要不相差2,才可以。其他就不可以。
B - Numbers on the Chessboard
都不懂题
C - Minimum Value Rectangle
分析:找数值最接近的两条边,并且它们数量大于2。所以主要找数据中的相等点或差距最小的两个数据。
- 问题一:一直输出奇怪的值,WA好几次,最后才发现是用完记数数组后没有清0。导致 T 次内数据一直增加。同时影响判断
- 问题二:判断最小差距的一个变量 ans 要定义为 double 类型 ,据别的博客上说,不定义为 double 类型肯定会WA,但不明白,差距最大不超过 1e4 ;
- 问题三:在判断时判断前后数据差会WA,所以我按别的博客上写的那样,判断 前后之比。
AC代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MA=1e6+5;
#define INF 0x3f3f3f3f;
int s[MA],b[MA];
int main()
{
int T,n;
scanf("%d",&T);
while(T--){
int a,tt=0;
scanf("%d",&n);
int s[10003]={0};//问题一
for(int i=1;i<=n;++i){
scanf("%d",&a);
s[a]++;
if(s[a]==2||s[a]==4)
b[++tt]=a;
}
sort(b+1,b+tt+1);
int t=0;
int x=0,y=0;
double ans=INF;
for(int i=1;i<tt;++i){
if(b[i]==b[i+1]){
x=b[i];
y=b[i+1];
break;
}
double m=b[i+1]*1.0/b[i];//问题2,3
if(m<ans){
ans=m;
x=b[i];
y=b[i+1];
}
}
printf("%d %d %d %d\n",x,x,y,y);
}
return 0;
}