codeforce #625 div2
传送门
A. Contest for Robots
题意
两个序列\(a,b\)表示一个比赛,分别输入\(a,b\),输入是1 代表这个回合得分,每个位置上的\(a,b\)是对应的回合,
二者在某一个回合可能都得分,求能够使\(a\)的总和大于\(b\)的总和中\(a\)的分最大值的可能的最小值
数据范围
\(1\leq n\leq 100\)
\(0 \leq r_{i} \leq 1\)
\left(0 \leq b_{i} \leq 1\right)
题解
分别统计\(a\)的个数和\(b\)的个数以及二者共同的个数分情况求解
Code
cpp
#include <bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int n;
bool a[N],b[N];
int main(){
cin>>n;
int ans=1;
int suma=0,sumb=0,same=0;
for(int i=1;i<=n;i++){
int x;
cin>>x;
a[i]=x;
if(x)
suma++;
}
for(int i=1;i<=n;i++){
int x;
cin>>x;
b[i]=x;
if(x && a[i]) same++;
if(x) sumb++;
}
if(suma == same && sumb >= same) {
ans=-1;
}
else if(suma>sumb) {
ans=1;
}
else if(suma <= sumb) {
int now=suma-same;
int need=sumb-same-now;
ans+=need/now;
ans+=1;
}
cout<<ans<<endl;
}
B. Journey Planning
题意
给定\(b\)序列,从中挑选满足\(C_{i+1}-C_{i} = b_{ci+1}-b_{ci}\) 的最大的集合
数据范围
\(1\leq n\leq 2 \times 10^{4}\)
\(1 \leq b_{i} \leq 4 \cdot 10^{5}\)
题解
$C_{i+1}-b_{ci+1} =C_{i} -b_{ci} $通过变换变成了一个满足下标和值的差相同的是一个集合直接hash将同一个集合累加起来求最大值即可
Code
cpp
#include <bits/stdc++.h>
#define ll long long
#define fi first
#define se second
using namespace std;
const int N=2e5+10;
unordered_map<ll,ll>p;
int main(){
ll n;
cin>>n;
ll ans=INT_MIN;
for(int i=1;i<=n;i++){
ll x;
cin>>x;
p[x-i]+=x;
ans=max(ans,p[x-i]);
}
cout<<ans<<endl;
}
C. Remove Adjacent]
题意
长度小于100的字符串, 对于\(i\)位置可以删去的条件是\(i-1\)或者\(i+1\)位置是它的上一个字母(比如\(a\)对于\(b\),\(d\)对于\(e\))
删去元素后前后两段合并,意味着\(i-1\)跟\(i+1\)相邻了,求最多能删去多少个元素
数据范围
\(1 \leq|s| \leq 100\)
题解
从字母\(z\)到\(b\)开始模拟,保证了每个字母后面没有大的可以删,满足最优
每个字母如果进行了删除操作,需要再遍历一次这个字母,因为删除以后相邻的可能会满足条件。
Code
cpp
#include<bits/stdc++.h>
#define N 110
using namespace std;
bool vis[N];
int main(){
int n;
string s;
cin >> n >> s;
int ans = 0;
for(int i = 25; i > 0; --i){
char now = 'a' + i;
int lastans = ans;
for(int j = 0; j < n; ++j){
int pre = j - 1, nex = j + 1;
while(pre >= 0 && vis[pre]){
pre--;
}
while(nex < n && vis[nex]){
nex++;
}
if(!vis[j] && s[j] == now && ((pre < 0 ? 0 : s[j] - s[pre] == 1) || (nex == n ? 0 : s[j] - s[nex] == 1))){
ans++;
vis[j] = true;
}
}
if(ans > lastans){
i++;
}
}
cout << ans << endl;
return 0;
}

浙公网安备 33010602011771号