前言
蒟蒻又来发题解了,今天都是思维题,又是烧脑写题的一天啊 QAQ 虽然当时做不出来,但是之后补题很快乐(^ - ^)!!!
A. Spy Detected!
A题原题戳这里
题目的大致意思:找到一个数组中不同于其他数字的数(水题,但是又又又考虑漏了一个关键点)
解题思路:既然那个数是与其它数字不相等,那么证明它与相邻的两个数都不相等,然后要考虑开头一个数和结尾的一个数,因为与它相邻的只有一个数。(因为这个导致提交罚时了QAQ)
题解:
#include<iostream>
using namespace std;
int main()
{
int t;
cin>>t;
while(t--)
{
int n;
cin>>n;
int a[n];
for(int i=0;i<n;i++)cin>>a[i];
if(a[0]!=a[1]&&a[0]!=a[2]){
cout<<"1"<<endl;
continue;
}
int i=1;
for(i=1;i<n-1;i++)
if(a[i]!=a[i-1]&&a[i]!=a[i+1]){
cout<<i+1<<endl;
break;
}
if(i==n-1)cout<<n<<endl;
}
return 0;
}
B. Almost Rectangle
B题原题戳这里
题目的大致意思:对输入的只含点和星号字符的矩阵进行操作,添加两个星号字符使得四个星号字符能在一个矩形的四个角上。
解题思路:分三种情况讨论,给定的两个点既不同行又不同列的情况;给定的两个点同行不同列;两个点同列不同行。第一种情况就是将两个点的列互换就可以了;第二种情况就先将行下移移动或者向上移动(看是否越界),列不变;第三种情况就是将列左移或者右移(看是否越界),行不变。(注意千万不要把题目理解成要拼凑成一个正方形,这样看第四个测试例子会出错。(因为这里理解错了导致Wa了三次还没检查出来(QWQ))。
题解:
#include<iostream>
using namespace std;
int main()
{
int t;
cin>>t;
while(t--)
{
int n;
cin>>n;
int x1=0,x2=0,y1=0,y2=0;
char a[n+1][n+1];
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++){
cin>>a[i][j];
if(x1==0&&y1==0&&a[i][j]=='*'){
x1=i;
y1=j;
}
if(x1!=0&&y1!=0&&a[i][j]=='*'){
x2=i;
y2=j;
}
}
if(x1!=x2&&y1!=y2){
a[x1][y2]='*';
a[x2][y1]='*';
}
else if(x1==x2){
x2++;
if(x2>n)x2-=2;
a[x2][y2]='*';
a[x2][y1]='*';
}
else {
y2++;
if(y2>n)y2-=2;
a[x1][y2]='*';
a[x2][y2]='*';
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++)
cout<<a[i][j];
cout<<endl;
}
}
return 0;
}
C. A-B Palindrome
C题原题戳这里
题目的大致意思:给定两个数字,是要求字符‘0’和‘1’的个数;在给定的只含‘0’,‘1’,‘?’字符的字符串内,用’1’和’0’替换中间的’?'使字符串能成回文串。
解题思路:第一遍遍历将已有的字符串变成回文串,然后统计一次’0’和’1’的个数,用,a,b减去已有的个数;将剩余的’?‘用还需要的’0’和’1’替换’?’,记得每次都是替换对称的两个’?’,用a,b减掉2。最后注意中间的那个字符,反转字符串,看是否是回文字符串。如果不能符合题目的要求,就输出-1。(大佬代码)
题解:
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
typedef long long ll;
int main()
{
int t;
cin >> t;
while (t--)
{
int a, b, n;
cin >> a >> b;
n = a + b;
string s;
cin >> s;
for (int i = 0; i < n; i++)
{
if (s[i] == '?')s[i] = s[n - i - 1];
}
a -= count(s.begin(), s.end(), '0');
b -= count(s.begin(), s.end(), '1');
for (int i = 0; i <= n / 2; i++)
{
if (i != n - i - 1 && s[i] == '?')
{
if (a > 1)
{
s[i] = s[n - i - 1] = '0';
a -= 2;
}
else if (b > 1)
{
s[i] = s[n - i - 1] = '1';
b -= 2;
}
}
else if (s[i] == '?')
{
if (a)
{
s[i] = '0';
a--;
}
else
{
s[i] = '1';
b--;
}
}
}
string t = s;
reverse(t.begin(), t.end());
if (t == s && a == 0 && b == 0)
cout << s << '\n';
else
cout << "-1\n";
}
return 0;
}
D. Corrupted Array
D题原题戳这里
题目的大致意思:给定数组b的数,在数组b中选择n个数字,使得n个数字的和也在b数组内,输出在b中选择的数字。(这数组b一定比a多两个数字)
解题思路:先对数组b进行sort排序,然后对前n+1个数字求和;然后遍历n次,减去每一次遍历的a数组值,即为n个数的和;去和第n + 2个数比较,然后特判一下,前n个数的和时是不是可能和第n + 1个数或第n + 2个数相等,不能满足条件就输出-1。(大佬代码)
题解:
#include <iostream>
#include<algorithm>
#include<cstring>
using namespace std;
typedef long long ll;
const int N = 400010;
int T;
int n;
ll b[N];
int main()
{
cin >> T;
while(T --)
{
cin >> n;
for(int i = 0;i < n + 2;i ++) cin >> b[i];
sort(b,b + n + 2);
ll sum = 0;
for(int i = 0;i < n + 1;i ++) sum += b[i];
int id = -1;
for(int i = 0;i < n;i ++){
if((sum - b[i]) == b[n + 1]){
id = i;
break;
}
}
if(id == -1){
sum -= b[n];
if(sum == b[n + 1]) id = n;
else if(sum == b[n]) id = n;
}
if(id == -1){
cout << id << endl;
}
else{
for(int i = 0;i < n + 1;i ++){
if(i != id) cout << b[i] << " ";
}
cout << endl;
}
memset(b,0,sizeof b);
}
return 0;
}
总结
能力有限,暂时只能解到这一题惹,剩余的题以后再更新(~ - ~)
|