• [bzoj1077]天平


    先考虑如何求出任意两数的最大差值和最小差值,直接差分约束建图跑floyd求最短路和最长路即可
    然后枚举i和j,考虑dA+dB和di+dj的关系,分两种情况移项,转化成dA-di和dj-dB的关系或dA-dj和di-dB的关系(只要有一个关系确定即确定)即可考虑(由于不等式都是两个变量,因此一定无法形成dA-dj和dB-di的固定关系)

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 int n,x,y,c1,c2,c3,mx[105][105],mn[105][105];
     4 char s[105];
     5 int main(){
     6     scanf("%d%d%d",&n,&x,&y);
     7     x--;
     8     y--;
     9     for(int i=0;i<n;i++){
    10         scanf("%s",s);
    11         for(int j=0;j<n;j++){
    12             mx[i][j]=2;
    13             mn[i][j]=-2;
    14             if (s[j]=='+')mn[i][j]=1;
    15             if (s[j]=='-')mx[i][j]=-1;
    16             if ((i==j)||(s[j]=='='))mx[i][j]=mn[i][j]=0;
    17         }
    18     }
    19     for(int i=0;i<n;i++)
    20         for(int j=0;j<n;j++)
    21             for(int k=0;k<n;k++){
    22                 mn[j][k]=max(mn[j][k],mn[j][i]+mn[i][k]);
    23                 mx[j][k]=min(mx[j][k],mx[j][i]+mx[i][k]);
    24             }
    25     for(int i=0;i<n;i++)
    26         for(int j=0;j<i;j++){
    27             if ((i==x)||(i==y)||(j==x)||(j==y))continue;
    28             if ((mn[x][i]>mx[j][y])||(mn[x][j]>mx[i][y]))c1++;
    29             if ((mx[x][i]<mn[j][y])||(mx[x][j]<mn[i][y]))c3++;
    30             if ((mx[x][i]==mn[x][i])&&(mx[j][y]==mn[j][y])&&(mx[x][i]==mx[j][y])||
    31                 (mx[x][j]==mn[x][j])&&(mx[i][y]==mn[i][y])&&(mx[x][j]==mx[i][y]))c2++;
    32         }
    33     printf("%d %d %d",c1,c2,c3);
    34 }
    View Code
  • 相关阅读:
    Add Binary
    Java笔记之String
    Java笔记之数组
    Merge Two Sorted Lists
    Remove Nth Node From End of List
    Longest Common Prefix
    Roman to Integer
    Palindrome Number
    Reverse Integer
    _cdel stdcall
  • 原文地址:https://www.cnblogs.com/PYWBKTDA/p/11797740.html
Copyright © 2020-2023  润新知