查分约束

C - 天平

 https://cn.vjudge.net/contest/263026#problem/C

 你有n个砝码,均为1克,2克或者3克。你并不清楚每个砝码的重量,但你知道其中一些砝码重量的大小关系。
你把其中两个砝码A和B放在天平的左边,需要另外选出两个砝码放在天平的右边。问:有多少种选法使得天平的左
边重(c1)、一样重(c2)、右边重(c3)?(只有结果保证惟一的选法才统计在内)

Input

  第一行包含三个正整数n,A,B(1<=A,B<=N,A和B不相等)。砝码编号为1~N。以下n行包含重量关系矩阵,
其中第i行第j个字符为加号“+”表示砝码i比砝码j重,减号“-”表示砝码i比砝码j轻,等号“=”表示砝码i和砝
码j一样重,问号“?”表示二者的关系未知。存在一种情况符合该矩阵

Output

  仅一行,包含三个整数,即c1,c2和c3。

Sample Input6 2 5 ?+???? -?+??? ?-???? ????+? ???-?+ ????-?

Sample Output1 4 1Hint

 

【数据规模】 4<=n<=50

 

题解:

给出A 和 B 找出C和 D 求A+B>C+D  A+B=C+D  A+B<C-D 

由 A+B>C+D   ->   A-C>D-B   ->   A-C的最小值>D-B的最大值    就能想到了差分约束

于是我们要差分约束把每两个砝码的最大差值和最小差值算出来 之后暴力枚举即可

 
#include<bits/stdc++.h>
using namespace std;
char s[60];
int mx[60][60], mi[60][60];

int main(){
    int n, A, B;
    scanf("%d%d%d", &n, &A, &B);
    for(int i = 1; i <= n; i++){
        scanf("%s", s + 1);
        for(int j = 1; j <= n; j++){
            if(i == j || s[j] == '=') mx[i][j] = mi[i][j] = 0;
            else if(s[j] == '-') mx[i][j] = -1, mi[i][j] = -2;
            else if(s[j] == '+') mx[i][j] = 2, mi[i][j] = 1;
            else mx[i][j] = 2, mi[i][j] = -2;
        }
        
    }
    for(int k = 1; k <= n; k++)
            for(int i = 1; i <= n; i++)
                for(int j = 1; j <= n; j++){
                    if(i == k || j == k || i == j)continue;
                    mx[i][j] = min(mx[i][j], mx[i][k] + mx[k][j]);
                    mi[i][j] = max(mi[i][j], mi[i][k] + mi[k][j]);
                }
    long long day = 0, xiaoy = 0, dengy = 0;
        for(int i = 1; i <= n; i++)
            for(int j = i+1; j <= n; j++){
                if(i == A || j == A || i == B || j == B)continue;
                if(mi[i][A] > mx[B][j] || mi[i][B] > mx[A][j])xiaoy++;
                if(mx[i][A] < mi[B][j] || mx[i][B] < mi[A][j])day++;
                if((mx[i][A] == mi[i][A] && mi[j][B] == mx[j][B] && mx[i][A] == mx[B][j]) ||
                (mx[j][A] == mi[j][A] && mi[B][i] == mx[B][i] && mx[j][A] == mx[B][i]))dengy++;
        }
    cout<<day<<" "<<dengy<<" " <<xiaoy<<endl;
} 
View Code

 

posted @ 2022-11-29 21:21  Ed_Sheeran  阅读(22)  评论(0编辑  收藏  举报