Codeforces 625 Div.2 部分题解

A. Contest for Robots
水题

#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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值