1. 程式人生 > 實用技巧 >【UOJ 639】控制公司

【UOJ 639】控制公司

#639. 控制公司

Statistics

【題目描述】:

有些公司是其他公司的部分擁有者,因為他們獲得了其他公司發行的股票的一部分。例如,福特公司擁有馬自達公司12%的股票。據說,如果至少滿足了以下條件之一,公司A就可以控制公司B了:

  • 公司A = 公司B。

  • 公司A擁有大於50%的公司B的股票。

  • 公司A控制K(K >= 1)個公司,記為C1, ..., CK,每個公司Ci擁有xi%的公司B的股票,並且x1+ .... + xK > 50%。

你將被給予一系列的三對數(i,j,p),表明公司i擁有公司j的p%的股票。計算所有的數對(h,s),表明公司h控制公司s。

寫一個程式讀入三對數(i,j,p),並且找出所有的數對(h,s),使得公司h控制公司s。

【輸入描述】:

第一行: N,表明接下來三對數的數量。

第二行到第N+1行:每行三個整數作為一個三對數(i,j,p),如上文所述。

【輸出描述】:

輸出零個或更多個的控制其他公司的公司。每行包括兩個整數表明序號為第一個整數的公司控制了序號為第二個整數的公司。將輸出的每行以第一個數字升序排列(並且第二個數字也升序排列來避免並列)。請不要輸出控制自己的公司。

【樣例輸入】:

3
1 2 80
2 3 80
3 1 20

【樣例輸出】:

1 2
1 3
2 3

【時間限制、資料範圍及描述】:

時間<=1s,空間<=128M

對於30%的資料i,j<=10

對於全部的資料i,j<=100

對於全部的資料N,p<=100

題解:普通暴力呃呃

#include<cstdio>
#include<iostream>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<bits/stdc++.h>
typedef long long ll;
using namespace std;
const int N=102;
int f[N][N],vis[N][N];
int n,x,y,z; int main(){ freopen("639.in","r",stdin); freopen("639.out","w",stdout); scanf("%d",&n); for(int i=1;i<=n;i++){ scanf("%d %d %d",&x,&y,&z); f[x][y]=z; } for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ if(f[i][j]>50) vis[i][j]=1; //if(i==j) continue; //if(vis[i][j]==1) printf("%d %d\n",i,j); } } // for(int ii=1;ii<=200;ii++){ for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ if(i==j) continue; int sum=0; for(int k=1;k<=n;k++){ if(k==i || k==j) continue; if(vis[i][k])sum+=f[k][j]; } if(sum>50){ vis[i][j]=1; //printf("%d %d\n",i,j); continue; } } }//} for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ if(i==j) continue; if(vis[i][j]==1) printf("%d %d\n",i,j); } } return 0; }