1. 程式人生 > >[SCOI2008]天平

[SCOI2008]天平

困難 pos 包含 存在 sam print oid reg pri

題目背景

2008四川NOI省選

題目描述

你有n個砝碼,均為1克,2克或者3克。你並不清楚每個砝碼的重量,但你知道其中一些砝碼重量的大小關系。你把其中兩個砝碼A 和B 放在天平的左邊,需要另外選出兩個砝碼放在天平的右邊。問:有多少種選法使得天平的左邊重(c1)、一樣重(c2)、右邊重(c3)?(只有結果保證惟一的選法才統計在內)

輸入輸出格式

輸入格式:

第一行包含三個正整數n,A,B(1<=A,B<=N,A 和B 不相等)。砝碼編號

為1~N。以下n行包含重量關系矩陣,其中第i行第j個字符為加號“+”表示砝

碼i比砝碼j重,減號“-”表示砝碼i比砝碼j 輕,等號“=”表示砝碼i和砝碼

j一樣重,問號“?”表示二者的關系未知。存在一種情況符合該矩陣。

輸出格式:

僅一行,包含三個整數,即c1,c2和c3。

輸入輸出樣例

輸入樣例#1:
6 2 5
?+????
-?+???
?-????
????+?
???-?+
????-?
輸出樣例#1:
1 4 1
輸入樣例#2:
14 8 4
?+???++?????++
-??=?=???????=
??????????=???
?=??+?==??????
???-???-???-??
-=????????????
-??=???=?-+???
???=+?=???????
??????????????
??????+???????
??=???-????-??
????+?????+???
-?????????????
-=????????????
輸出樣例#2:
18 12 11

說明

4<=n<=50

暴力:25

用拓撲排序確定每個點的重量,然後暴力枚舉哪兩個點。

但是拓撲序不確定,題目要求確定才能統計,所以WA+T+A

正解:

差分約束。

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 using namespace std;
 6 const int N=60;
 7 int Max[N][N],Min[N][N];
 8 char s[N];
9 int n,A,B,c1,c2,c3; 10 void Floyd() 11 { 12 for(int k=1;k<=n;k++) 13 for(int i=1;i<=n;i++) 14 for(int j=1;j<=n;j++) 15 if(i!=k && i!=j && k!=j) 16 { 17 Max[i][j]=min(Max[i][j],Max[i][k]+Max[k][j]); 18 Min[i][j]=max(Min[i][j],Min[i][k]+Min[k][j]); 19 } 20 } 21 void work() 22 { 23 for(int i=1;i<=n;i++) 24 for(int j=1;j<i;j++) 25 if(i!=A && i!=B && j!=A && j!=B) 26 { 27 if(Min[A][i]>Max[j][B] || Min[A][j]>Max[i][B])c1++; 28 if(Max[A][i]<Min[j][B] || Max[B][i]<Min[j][A])c3++; 29 if(Max[A][i]==Min[A][i] && Max[j][B]==Min[j][B] && Max[A][i]==Max[j][B]) c2++; 30 else if(Max[A][j]==Min[A][j] && Max[i][B]==Min[i][B] && Max[A][j]==Max[i][B]) c2++; 31 } 32 printf("%d %d %d",c1,c2,c3); 33 } 34 int main() 35 { 36 scanf("%d%d%d",&n,&A,&B); 37 for(int i=1;i<=n;i++) 38 { 39 scanf("%s",s+1); 40 for(int j=1;j<=n;j++) 41 { 42 if(s[j]===||i==j+1) Max[i][j]=0,Min[i][j]=0; 43 if(s[j]==+) Max[i][j]=2,Min[i][j]=1; 44 if(s[j]==-) Max[i][j]=-1,Min[i][j]=-2; 45 if(s[j]==?)Max[i][j]=2,Min[i][j]=-2; 46 } 47 } 48 Floyd(); 49 work(); 50 return 0; 51 }

死亡是最簡單不過的事情,但真正困難的是光榮的活下去。

[SCOI2008]天平