1324A - Yet Another Tetris Problem(思维)



题意

  • 给一个数组,每一个数组中的元素大小表示在竖直方向的方块数量,元素相邻怎竖直方向的方块也相邻,类似于俄罗斯方块当底层被堆满的时候,那么那一层可以被消去,然后我们可以在任意一个元素(数列)上 + 2 两个小方块,可以放任意多次数,问最终能不能通过这些操作能不能把所有的小方块消去。

思路

  • 思路:我们可以先把底层的能消除的消除,如果消除之后 所给的数组元素中还有奇数,那么无论怎么 操作 都不能 消除完

代码

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<string>
#include<vector>
#include<map> using namespace std;
#define ll long long
#define db double int main()
{
ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
//freopen("A.txt","r",stdin);
int t;
cin >> t;
while(t --)
{
int n;
cin >> n;
int ar[105];
int mn = 1e9;
for(int i = 1; i <= n; i ++)
cin >> ar[i], mn = min(mn, ar[i]);
int have_odd = 0;
for(int i = 1; i <= n; i ++)
{
ar[i] -= mn;
if(ar[i] % 2 != 0)
{
have_odd = 1;
break;
}
} if(have_odd)
cout << "NO\n";
else
cout << "YES\n";
} return 0;
}
  • 收获:就是一个简单的观察

1324B - Yet Another Palindrome Problem(思维)

题意

  • 给一个序列,问在这个子序列中能否找到一个 回文 子串。

思路

  • 这一题我们可以用 map 的特性去遍历一遍所给的数组,同在这个序列中都有哪些 数字出现过,并且记录第一次出现的位置,这样我们在从右自左遍历这个序列,我们没遍历到一个元素 我们就 用map看看是否这个 数字已经出现过了,如果没有,就去往后遍历,如果有 我们就判断两个 两个相同的数组出翔位置,的间隔差 是否大于1,如果大于,那么这两个相同的数就可以与这两个位置中的任意一个数组成一个 回文子串了;如果小于等于1 没法组成会微,继续向下遍历吧

代码

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<string>
#include<vector>
#include<map> using namespace std;
#define ll long long
#define db double int main()
{
ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
//freopen("A.txt","r",stdin);
int t;
cin >> t;
while(t --)
{
int n;
cin >> n;
map<int, int> mp;
int ar[50005];
for(int i = 1; i <= n; i ++)
{
cin >> ar[i];
if(! mp[ar[i]])
{
mp[ar[i]] = i;
}
}
int flag = 0;
for(int i = n; i > 1; i --)
{
if(mp[ar[i]] && i - mp[ar[i]] > 1)
{
flag = 1;
break;
}
}
if(! flag)
cout << "NO\n";
else
cout << "YES\n";
} return 0;
}
  • 收获:读好题,利用好map 的记录某个一个状态、某个数的位置/出现过没有,当我们把某个数带入map中之后,同过判读是否为0,就可以判读啊某个状态、位置、出现过没没有,通过一前一后呼应 来做题

1324C - Frog Jumps

题意