前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【小码匠自习室】我的目标去哪了?

【小码匠自习室】我的目标去哪了?

作者头像
小码匠
发布2023-03-06 14:32:47
4850
发布2023-03-06 14:32:47
举报
文章被收录于专栏:小码匠和老码农

我的目标去哪了?

昨晚开森AC了ABC 286 - E - Souvenir,小开森。。。

假期过半了,距离最初假期目标还有差距, 熟悉了下面相关算法,并刷了相关题目

  • 位运算
  • 并查集
  • 最短路:dijkstra和floyd

还有

  • 最短路:Bellman-Ford和SPFA
  • 生成树
  • 线段树、树状数组
  • 组合数学

鸭梨山大。。。

欺负小孩没商量,我要找老码农谈判,机器人小码匠要濒临崩溃了。。。

题目

  • E - Souvenir
    • https://atcoder.jp/contests/abc286/tasks/abc286_e

有N个城市。还有连接不同城市的单程直达航班。

直飞航班的可用性由N个字符串

S_1、S_2、\ldots、S_N

表示,每个字符串长度为N。如果S

_i

的第j个字符是Y,则有从城市i到城市j的直达航班;如果是N,则不存在。

每个城市都出售一件纪念品;城市i出售价值a

_i

的纪念品。

考虑以下问题:

高桥目前在S市,希望通过一些直飞航班到达T市(与S市不同)。 每次他访问一个城市(包括S和T),他都会在那里购买纪念品。 如果从S市到T市有多条路线,高桥决定路线如下:

  • 他试图尽量减少从S市到T市的直达航班数量。
  • 然后,他试图使他购买的纪念品的总价值最大化。

确定他是否可以使用直飞航班从S市前往T市。如果可以,请在满足上述条件的路线中查找“直飞航班数量”和“纪念品总价值”。

您将获得不同城市的Q对

(U_i,V_i)

对于每个

1\leq i\leq Q

,当

S=U_i

T=V_i

时,打印上述问题的答案.

Constraints
2 \leq N \leq 300
1\leq A_i\leq 10^9
S_i

是由YN组成的长度为N的字符串。

  • The i-th character of
S_i

is N.

1\leq Q\leq N(N-1)
1\leq U_i,V_i\leq N
U_i\neq V_i
  • If i
\neq j

, then

(U_i,V_i)\neq (U_j,V_J)

.

N、A_i、Q、U_i

V_i

都是整数。


输入
  • N
  • A
_1

A

_2
\ldots

A

_N
  • S
_1
  • S
_2
\vdots
  • S
_N
  • Q
  • U
_1

V

_1
  • U
_2

V

_2
\vdots
  • U
_Q

V

_Q
输出

打印Q行。

如果他不能从城市U

_i

出发,第i行(

1\leq i\leq Q

)应包含Impossible 至城市V

_i

; 如果可以的话,该行应该包含“直飞航班的数量”和“纪念品的总价值”,按照上述顺序,用空格隔开。


示例输入 1
代码语言:javascript
复制
5
30 50 70 20 60
NYYNN
NNYNN
NNNYY
YNNNN
YNNNN
3
1 3
3 1
4 5
示例输出 1
代码语言:javascript
复制
1 100
2 160
3 180

对于

(S,T)=(U_1,V_1)=(1,3)

,有一个从城市1到城市3的直飞航班,因此直飞航班的最小可能数量为1,这是在他使用该直飞航班时实现的。在这种情况下,纪念品的总价值为

A_1+A_3=30+70=100

对于

(S,T)=(U_2,V_2)=(3,1)

,直飞航班的最小可能数量为2。以下两条路线达到最低要求:城市,

3\to 4\to 1

城市。由

3\to 5\to 1

于两条路线的纪念品总价值分别为70+20+30=120和70+60+30=160,因此他选择了后一条路线,纪念品总价值为160。

对于

(S,T)=(U_3,V_3)=(4,5)

,当他旅行城市时

4\to 1\to 3\to 5

,直飞航班的数量最少,其中纪念品的总价值为20+30+70+60=180。


示例输入 2
代码语言:javascript
复制
2
100 100
NN
NN
1
1 2
示例输出2
代码语言:javascript
复制
Impossible

可能根本没有直飞航班。

小码匠

代码
代码语言:javascript
复制
#include <bits/stdc++.h>
using namespace std;
#define endl '\n';
 
void best_coder() {
    int n;
    cin >> n;
    vector<long long> v(n);
    for (int i = 0; i < n; ++i) {
        cin >> v[i];
    }
    
    int INF = 1e9;
    vector<vector<int>> g(n, vector<int>(n, INF));
    vector<vector<long long>> dp(n, vector<long long>(n, 0));
    for (int i = 0; i < n; ++i) {
        for (int j = 0; j < n; ++j) {
            char a;
            cin >> a;
            if (a == 'Y') {
                g[i][j] = 1;
                dp[i][j] = v[i] + v[j];
            }
        }
    }
    
    for (int i = 0; i < n; ++i) {
        for (int j = 0; j < n; ++j) {
            if (j == i) {
                continue;
            }
            for (int s = 0; s < n; ++s) {
                if (s == i || s == j) {
                    continue;
                }
                if (g[i][s] + g[j][i] < g[j][s]) {
                    dp[j][s] = dp[i][s] + dp[j][i] - v[i];
                    g[j][s] = g[i][s] + g[j][i];
                } else if (g[i][s] + g[j][i] == g[j][s]){
                    dp[j][s] = max(dp[i][s] + dp[j][i] - v[i], dp[j][s]);
                }
            }
        }
    }
    
    int m;
    cin >> m;
    for (int i = 0; i < m; ++i) {
        int a, b;
        cin >> a >> b;
        --a;
        --b;
        if (g[a][b] == INF) {
            cout << "Impossible" << endl;
            continue;
        }
        cout << g[a][b] << " " << dp[a][b] << endl;
    }
}
 
void happy_coder() {
}
 
int main() {
    // 提升cin、cout效率
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);
 
    // 小码匠
    best_coder();
 
    // 最优解
    // happy_coder();
 
    // 返回
    return 0;
}
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-01-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 小码匠和老码农 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 我的目标去哪了?
  • 题目
    • Constraints
      • 输入
        • 输出
          • 示例输入 1
            • 示例输出 1
              • 示例输入 2
                • 示例输出2
                • 小码匠
                  • 代码
                  领券
                  问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档