蓝桥杯11

P8715 [蓝桥杯 2020 省 AB2] 子串分值

题目描述

对于一个字符串 S S S, 我们定义 S S S 的分值 f ( S ) f(S) f(S) S S S 中恰好出现一次的字符个数。例如 f ( ′ ′ a b a ′ ′ ) = 1 f\left({ }^{\prime \prime} \mathrm{aba}{ }^{\prime \prime}\right)=1 f(aba)=1 f ( ′ ′ a b c ′ ′ ) = 3 f\left({ }^{\prime \prime} \mathrm{abc}{ }^{\prime \prime}\right)=3 f(abc)=3 f ( ′ ′ a a a a ′ ′ ) = 0 f\left({ }^{\prime \prime} \mathrm{aaa} \mathrm{a}^{\prime \prime}\right)=0 f(aaaa)=0

现在给定一个字符串 S [ 0.. n − 1 ] S[0 . . n-1] S[0..n1](长度为 n n n),请你计算对于所有 S S S 的非空 子串 S [ i . . j ] ( 0 ≤ i ≤ j < n ) S[i . . j](0 \leq i \leq j<n) S[i..j](0ij<n) f ( S [ i . . j ] ) f(S[i . . j]) f(S[i..j]) 的和是多少。
题解
在这里插入图片描述

#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define int long long
const int N = 2010;
int a[N] = {0};
int b[N] = {0};
int c[N] = {0};
int d[N] = {0};
int vis[N] = {0};
int g[N][N] = {0};
vector<int> mp[N];
void Solve()
{
    int n, m, k, t;
    cin >> n >> m >> k >> t;
    queue<int> p;
    // for(int i = 0; i <= n; ++i){
    //     for(int j = 0; j <= n; ++j){
    //         g[i][j] = 0;
    //     }
    // }
    for(int i = 1; i <= n; ++i){
        cin >> a[i];
    }
    for(int i = 0; i <= n; ++i){
        d[i] = 1e9;
    }
    for(int i = 1; i <= m; ++i){
        int x;
        cin >> x;
        vis[x] = 1;
        p.push(x);
        d[x] = 0;
    }
    for(int i = 1; i <= k; ++i){
        int aa, bb, cc;
        cin >> aa >> bb >> cc;
        mp[aa].push_back(bb);
        mp[bb].push_back(aa);
        g[aa][bb] = g[bb][aa] = cc;
    }
    while(!p.empty()){
        int u = p.front();
        p.pop();
        vis[u] = 0;
        for(auto i:mp[u]){
            if(g[u][i]){
                int v = g[u][i];
                if(d[i] != 1e9){
                    d[v] = min(d[v], max(d[u], d[i]) + max(a[u], a[i]));
                    if(vis[v] == 0){
                       p.push(v);
                       vis[v] = 1;
                    }
                }
            }
        }
    }
    cout << d[t] << endl;
} 
signed main()
{
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    int __ = 1;
    while(__--) Solve();
    return 0;
}

P8733 [蓝桥杯 2020 国 C] 补给

题目描述

小蓝是一个直升飞机驾驶员,他负责给山区的 n n n 个村庄运送物资。

每个月,他都要到每个村庄至少一次,可以多于一次,将村庄需要的物资运送过去。

每个村庄都正好有一个直升机场,每两个村庄之间的路程都正好是村庄之间的直线距离。

由于直升机的油箱大小有限,小蓝单次飞行的距离不能超过 D D D。每个直升机场都有加油站,可以给直升机加满油。

每个月,小蓝都是从总部出发,给各个村庄运送完物资后回到总部。如果方便,小蓝中途也可以经过总部来加油。

总部位于编号为 1 1 1 的村庄。

请问,要完成一个月的任务,小蓝至少要飞行多长距离?

输入格式

输入的第一行包含两个整数 n n n D D D,分别表示村庄的数量和单次飞行的距离。

接下来 n n n 行描述村庄的位置,其中第 i i i 行两个整数 x i x_i xi y i y_i yi 分别表示编号为 i i i 的村庄的坐标。村庄 i i i 和村庄 j j j 之间的距离为 ( x i − x j ) 2 + ( y i − y j ) 2 \sqrt{(x_i-x_j)^2+(y_i-y_j)^2} (xixj)2+(yiyj)2

输出格式

输出一行,包含一个实数,四舍五入保留正好 2 2 2 位小数,表示答案。

题解

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值