250pt:

水题set处理。

500pt:

题意:

给你一个图,每条边关联的两点为朋友,题目要求假设x的金钱为y,则他的左右的朋友当中的钱数z,取值为y - d <= z <= y + d.求使得任意两点的最大金钱差值,若果是inf输出-1.

思路:
求任意两点的最短的的最大值即可,比赛时不知道哪地方写搓了,直接被系统样例给虐了,老师这么悲剧500有思路能写,老师不仔细哎..

floyd求任意两点的最短距离好写一些。

#include <iostream>
#include <cstdio>
#include <cmath>
#include <vector>
#include <cstring>
#include <algorithm>
#include <string>
#include <set>
#include <functional>
#include <numeric>
#include <sstream>
#include <stack>
#include <map>
#include <queue>

#define CL(arr, val)    memset(arr, val, sizeof(arr))

#define lc l,m,rt<<1
#define rc m + 1,r,rt<<1|1
#define pi acos(-1.0)
#define ll __int64
#define L(x)    (x) << 1
#define R(x)    (x) << 1 | 1
#define MID(l, r)   (l + r) >> 1
#define Min(x, y)   (x) < (y) ? (x) : (y)
#define Max(x, y)   (x) < (y) ? (y) : (x)
#define E(x)        (1 << (x))
#define iabs(x)     (x) < 0 ? -(x) : (x)
#define OUT(x)  printf("%I64d\n", x)
#define lowbit(x)   (x)&(-x)
#define keyTree (chd[chd[root][1]][0])
#define Read()  freopen("din.txt", "r", stdin)
#define Write() freopen("dout.txt", "w", stdout);


#define M 25000
#define N 207

using namespace std;


const int inf = 0x7f7f7f7f;
const int mod = 1000000007;

int f[N][N];
int n;
void floyd()
{
    for (int k = 1; k <= n; ++k)
    {
        for (int i = 1; i <= n; ++i)
        {
            for (int j = 1; j <= n; ++j)
            {
                if (f[i][k] != inf && f[k][j] != inf && f[i][j] > f[i][k] + f[k][j])
                {
                    f[i][j] = f[i][k] + f[k][j];
                }
            }
        }
    }

}
class Egalitarianism
{
    public:
    int maxDifference(vector <string> isF, int d)
    {
        n = isF.size();
        for (int i = 1; i <= n; ++i)
        {
            for (int j = 1; j <= n; ++j) f[i][j] = inf;
        }
        for (int i = 0; i < n; ++i)
        {
            for (int j = 0; j < n; ++j)
            {
                if (isF[i][j] == 'Y')
                {
                    f[i + 1][j + 1] = 1;
                }
            }
        }
        floyd();
        int Ma = 0;
        for (int i = 1; i <= n; ++i)
        {
            for (int j = 1; j <= n; ++j)
            {
                if (i == j) continue;
                Ma = max(Ma,f[i][j]);
            }
        }
        if (Ma == inf) return -1;
        else return Ma*d;
    }
};
View Code

相关文章:

  • 2021-05-24
  • 2021-12-03
  • 2021-12-29
  • 2021-07-25
  • 2021-10-06
  • 2021-12-16
  • 2022-12-23
  • 2022-12-23
猜你喜欢
  • 2021-07-12
  • 2021-12-05
  • 2021-09-05
  • 2021-10-05
  • 2021-10-11
  • 2021-09-24
  • 2021-07-03
相关资源
相似解决方案