#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 110;
int r[maxn],b[maxn];
int x,y;
int main (){
int n;cin>>n;
for (int i=1;i<=n;++i){
cin>>r[i];
}
for (int i=1;i<=n;++i) {
cin>>b[i];
if (r[i]!=b[i]){
x += r[i];
y += b[i];
}
}
if (x == 0){
puts("-1");
}
else{
printf("%d",y/x+1);
}
return 0;
}
B. Journey Planning
从题目可以知道
每个城市有beauty值b
可以相互连通的城市i和j之间 i - j == b[i] - b[j]
所以i - b[i] == j - b[j]
所以可以连通的所有城市i - b[i] 都是相等的
记录可以给到每一个差值的beauty值之和再取max就可以了
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 2e5+10;
unordered_map<ll,ll> m;
int n;
ll ans;
int main(){
cin>>n;
for(ll i=1;i<=n;i++){
ll x;
cin>>x;
m[x-i]+=x;
ans=max(m[x-i],ans);
}
cout<<ans<<endl;
return 0;
}
C. Remove Adjacent
这题的意思就是在一个字符串中如果一个字符的两边存在它的(字母表中)前一个字符它就可以被删去 问最多能删多少个
发现暴力就可以很简单的解决这个问题 全部删掉最多也就遍历一百次
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 2e5+10;
string s;
int main (){
int n;
cin>>n;
cin>>s;
for (char i='z';i>='a';--i){
while (1) {
int fg = 1,len = s.size();
for (int j = 0; j < len; ++j) {
if (s[j] != i) continue;
if ((j > 0 && s[j - 1] == i - 1) || (j < len - 1 && s[j + 1] == i - 1)) {
fg = 0;
s = s.substr(0,j)+s.substr(j+1,len-j-1);
break;
}
}
if (fg) break;
}
}
cout<<n-s.size();
return 0;
}
D. Navigation System
题目很长(看着就不想写)
大概意思就是要从s走到t用导航 导航每次会选择当前点到t点的一条最短路(可能不唯一)给你 如果没有按照导航走导航就会rebuild一次导航路线
给一张有向图和从s到t走的路线 问rebuild最大和最小的次数各是多少
想法就是先从t点bfs一遍全图 可以知道每个点到t点的最短路路长 并且存下每个点x下一步可以从哪几个点用最短距离到达t
然后再从头走一遍 如果上一个点到当前点的这条路不是上一个点到t的最短路 那么最大最小值就都要加一 否则看上一个点到t的最短路中除了往当前这个点走还有没有别的路线 有的话最大值加一
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 2e5+10;
map<ll,int>mp;
vector<int>g[maxn];
int n,m;
int step[maxn];
int num[maxn],p[maxn];
struct node{
int id,step;
};
void bfs(int a){
queue<int>q;
q.push(a);
step[a] = 1;
while (!q.empty()){
int x = q.front();
q.pop();
int s = g[x].size();
for (int i=0;i<s;++i){
int y = g[x][i];
if (step[y]) {
if (step[y] == step[x] + 1){//有多条路 记录一下
mp[(ll)1000000ll*y+x] = 1,num[y]++;
}
continue;
}
mp[(ll)1000000ll*y+x] = 1;
step[y] = step[x] + 1;
q.push(y);
}
}
}
int ans1,ans2;//最小和最大
int main (){
ios::sync_with_stdio(0);
cin>>n>>m;
int u,v,k;
for (int i=1;i<=m;++i){
cin>>u>>v;
g[v].push_back(u);//这里要反着存图
}
cin>>k;
for (int i=1;i<=k;++i) cin>>p[i];
bfs(p[k]);
for (int i=2;i<=k;++i){
if (mp[(ll)1000000ll*p[i-1]+p[i]]){
if (num[p[i-1]]) ans2++;
}
else ans1++,ans2++;
}
cout<<ans1<<" "<<ans2<<endl;
return 0;
}
写的时候好粗心qwq