A:
对一个大数进行操作,使得不被2整除,各位之和被2整除
先操作最后一位,最后一位必须为单数,之后各位只保留一个单数即可,其他单数都删掉。
#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int t;
cin >> t;
while(t--)
{
int n;
cin >> n;
string s;
cin >> s;
while(n > 1)
{
if(s[n-1] == '0' || s[n-1] == '2'||s[n-1] == '4'||s[n-1] == '6' ||s[n-1] == '8')
{
s[n-1]='#';//把最后一位删去
n--;
}
else
break;//把最后一位处理完
}
if(s[n-1] == '0' || s[n-1] == '2'||s[n-1] == '4'||s[n-1] == '6' ||s[n-1] == '8')
{
cout << -1 << endl;
continue;
}
int flag = 0;
for(int i = 0; i < n - 1; i++)
{
if(!flag)
{
if(s[i] == '1'||s[i] == '3'||s[i] == '5'||s[i] == '7'||s[i] == '9')
{
flag = 1;
}
}
else
{
if(s[i] == '1'||s[i] == '3'||s[i] == '5'||s[i] == '7'||s[i] == '9')
{
s[i] = '#';
}
}
}
if(flag == 0)
{
cout << -1 << endl;
continue;
}
for(int i = 0; i < n; i++)
{
if(s[i] != '#')
cout << s[i];
}
cout << endl;
}
return 0;
}
B:
给你一个数组,要求你选定一个数,他左边递增,右边递减
可以对任意一个数进行操作,使其-1,可以操作任意次。
可以这样认为,从左到中间的max,操作之后,最坏情况就是0,1,2,3,…max,max-1…3,2,1,0
即我先选定从左到右第一个a[i] < i的为max,他左边都满足a[i] > i
看他的右边,是否都满足递减。
之后就是判断max中间这两个数会不会相等:就是说max左边是一个递增到i-1的序列,从max开始向右是一个递减的序列,
max与max左边一个数有可能相等,max从右往左的n-i-1有可能与max左侧从左往右的i-1相等。
#include <iostream>
#include <algorithm>
using namespace std;
const int maxn = 3e5 + 50;
int a[maxn];
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int t;
cin >> t;
while(t--)
{
int n;
cin >> n;
for(int i = 0; i < n; i++)
{
cin >> a[i];
}
int ans = 0;//默认可以
int t = -1;
for(int i = 0; i < n; i++)
{
if(a[i] < i)//不满足的
{
t = i;
break;
}
}
if(t > 0)
{
for(int i = t; i < n; i++)
{
if(a[i] < n - i - 1)
{
ans = 1;
// cout << "右边不满足";
}
}
if(t-1 == n-t-1 && a[t] >= a[t-1])
{
ans = 1;
// cout << "相等";
}
}
if(!ans)
{
cout << "Yes" << endl;
}
else
{
cout << "No" << endl;
}
}
return 0;
}