A. Number Replacement
题意概述:
给一个数 n ,给一个 n 个数的数组,数组中相同的数字可以一次变成任意相同的字母,给定一个字符串,问数组能否变成给定字符串。
思路:
首先,很明显可以发现如果数组中每个元素都不一样,那么一定可以变成给定字符串,问题变成了相同元素能不能恰好变成相应位置上的字符,所以就成了:相同元素的位置的字符是否相同。
代码:
void solve(){
int n;
cin >> n;
vi a(n);
for (int i = 0; i < n;i++)
cin >> a[i];
string s;
cin >> s;
int flag = 0;
for (int i = 0; i < n;i++){
for (int j = i + 1; j < n;j++){
if(a[i]==a[j]){
if(s[i]!=s[j])
flag = 1;
}
}
}
if(flag)
cout << "no" << nl;
else
cout << "yes" << nl;
}
B. Even-Odd Increments
题目概述:
给你n个整数 a 1 , a 2 , . . . , a n a_1,a_2,...,a_n a1,a2,...,an。处理两种类型的q个查询。
"
0
0
0
x
j
x_j
xj "形式的查询:将值
x
j
x_j
xj加入数组a的所有偶数元素中。
"
1
1
1
x
j
x_j
xj "形式的查询:将值
x
j
x_j
xj添加到数组a的所有奇数元素中。
注意,在处理查询时,我们特别看
a
i
a_i
ai的奇数/偶数值,而不是它的索引。
处理完每个查询后,打印数组a的元素之和。
思路:
先求和,统计奇偶个数,每次查询先判断奇偶,更新奇偶个数即可。
代码:
void solve(){
ll n, q;
cin >> n >> q;
vll a(n), b(n);
ll sum = 0;
for (int i = 0; i < n;i++)
cin >> a[i], sum += a[i];
ll ji = 0, ou = 0;
for (int i = 0; i < n;i++){
if(a[i]%2==0)
ou++;
else
ji++;
}
while (q--){
ll a, b;
cin >> a >> b;
if (a){//1 ji
sum += b * ji;
if(b%2==0){//b ou
}else{// b ji
ou += ji;
ji = 0;
}
}else{// 0 ou
sum += b * ou;
if(b%2==0){//b ou
}else{// b ji
ji += ou;
ou = 0;
}
}
cout << sum << nl;
}
}
Traffic Light
题目概述:
你发现自己在一个不寻常的十字路口,有一个奇怪的交通灯。该交通灯有三种可能的颜色:红色(r),黄色(y),绿色(g)。众所周知,交通灯每隔n秒重复一次颜色,在第i秒时,颜色si亮起。
你知道此刻红绿灯是哪种颜色,但你不知道当前的时间时刻。你需要找到保证你过马路的最小时间。
你可以假设你立即过马路。
例如,在s="rggry "和当前颜色r的情况下,有两个选项:要么1秒后绿灯亮,要么3秒后绿灯亮。这样一来,答案就等于3–也就是在当前颜色为r的情况下,我们保证会过马路的秒数。
思路:
找到目标字符 c 后第一次出现 g
的位置,取最大值,如果后面没有则循环处理。
代码:
不使用二分,循环即二倍,使用 cnt 计数,flag
表示是否可以计数
void solve(){
int n;cin >> n;
char c;cin >> c;
string s;cin >> s;
string ss = s + s;
//cout << ss << nl;
if(c=='g')
cout << 0 << nl;
else {
ll cnt , maxx = 0;
int flag = 1;
for (int i = 0; i < n * 2; i++){
if(ss[i]=='g'){
cnt = 0;
flag = 1;
}else if(ss[i]==c && flag){
cnt = 1;
flag = 0;
}else if(!flag){
cnt++;
}
//cout << cnt << " ";
maxx = max(cnt, maxx);
}
cout << maxx << nl;
}
}
二分:
void solve(){
int n;
cin >> n;
char c;
cin >> c;
string s;
cin >> s;
vi a;
for (int i = 0; i < n;i++)
if(s[i]=='g')
a.push_back(i);
if (c == 'g')
cout << 0 << nl;
else{
int fist = a[0], maxx = 0;
for (int i = 0; i < n;i++){
if(s[i]==c){
auto x = upper_bound(all(a), i) ;
if(x!=a.end()){
maxx = max(maxx, *x - i);
}else{
maxx = max(maxx, n - i + fist + 1 - 1);
}
}
}
cout << maxx << nl;
}
}