usaco-Section 2.3-Controlling Companies

Controlling Companies

Some companies are partial owners of other companies because they have acquired part of their total shares of stock. For example, Ford owns 12% of Mazda. It is said that a company A controls company B if at least one of the following conditions is satisfied:

  • Company A = Company B
  • Company A owns more than 50% of Company B
  • Company A controls K (K >= 1) companies denoted C1, ..., CK with each company Ci owning xi% of company B and x1 + .... + xK > 50%.

Given a list of triples (i,j,p) which denote company i owning p% of company j, calculate all the pairs (h,s) in which company h controls company s. There are at most 100 companies.

Write a program to read the list of triples (i,j,p) where i, j and p are positive integers all in the range (1..100) and find all the pairs (h,s) so that company h controls company s.

PROGRAM NAME: concom

INPUT FORMAT

Line 1: n, the number of input triples to follow
Line 2..n+1: Three integers per line as a triple (i,j,p) described above.

SAMPLE INPUT (file concom.in)

3
1 2 80
2 3 80
3 1 20

OUTPUT FORMAT

List 0 or more companies that control other companies. Each line contains two integers that denote that the company whose number is the first integer controls the company whose number is the second integer. Order the lines in ascending order of the first integer (and ascending order of the second integer to break ties). Do not print that a company controls itself.

SAMPLE OUTPUT (file concom.out)

1 2
1 3
2 3

一道简单的dfs题,把每一个公司都作为总公司,分别得出占有其他公司的股份。

代码如下:
/*
ID: yizeng21
PROB: concom
LANG: C++
*/
#include<stdio.h>
#include<algorithm>
#include<string.h>
using namespace std;
bool vist[1000];
int n;
int chun[1000][1000];
int q[1000][1000];
void dfs(int pos,int s){
    for(int i=1;i<=100;i++)
        if(chun[pos][i]!=0){
            if(vist[i]==1)continue;
            q[s][i]+=chun[pos][i];
            if(q[s][i]>50){
                vist[i]=1;
                dfs(i,s);
            }
        }
}
struct hh{
    int x,y;
}w[10000];
bool cmp(hh i,hh j){
    if(i.x<j.x)return 1;
    if(i.x==j.x){
        if(i.y<j.y)return 1;
        return 0;
    }
    return 0;
}
int main(){
    freopen("concom.in","r",stdin);
    freopen("concom.out","w",stdout);
    scanf("%d",&n);
    for(int i=1;i<=n;i++){
        int a,b,c;
        scanf("%d%d%d",&a,&b,&c);
        chun[a][b]=c;
    }
    int tot=0;
    for(int i=1;i<=100;i++){
        memset(q,0,sizeof(q));
        memset(vist,0,sizeof(vist));
        dfs(i,i);
        for(int j=1;j<=100;j++)
            if(vist[j]==1){
                w[++tot].x=i;
                w[tot].y=j;
            }
    }
    sort(w+1,w+tot+1,cmp);
    for(int i=1;i<=tot;i++)
        if(w[i].x!=w[i].y)
            printf("%d %d\n",w[i].x,w[i].y);
}
时间: 2024-10-03 09:44:41

usaco-Section 2.3-Controlling Companies的相关文章

【USACO 2.3】Controlling Companies (递推)

题意:A公司对B公司有控制权的条件是满足下面条件之一:A=B,A对B的股份超过50%,A控制的公司对B的股份之和超过50%. 分析:我把控制关系分个等级:第一级是直接的股份超过50%,第二级是至少需要隔着第一级控制的公司才能控制此公司,... 从第一级推到第二级,第二级推到第三级...结束条件是这一次没有增加任何控制关系. http://train.usaco.org/usacoprob2?a=O1HFwuT0pRX&S=concom /* TASK:concom LANG:C++ */ #in

usaco题目分享——Controlling Companies

Controlling Companies Some companies are partial owners of other companies because they have acquired part of their total shares of stock. For example, Ford owns 12% of Mazda. It is said that a company A controls company B if at least one of the foll

洛谷P1475 控制公司 Controlling Companies

P1475 控制公司 Controlling Companies 66通过 158提交 题目提供者该用户不存在 标签USACO 难度普及/提高- 提交  讨论  题解 最新讨论 暂时没有讨论 题目描述 有些公司是其他公司的部分拥有者,因为他们获得了其他公司发行的股票的一部分.(此处略去一句废话)据说,如果至少满足了以下三个条件之一,公司A就可以控制公司B了: 公司A = 公司B. 公司A拥有大于50%的公司B的股票. 公司A控制K(K >= 1)个公司,记为C1, ..., CK,每个公司Ci拥

USACO Section 2.1 Healthy Holsteins

/* ID: lucien23 PROG: holstein LANG: C++ */ #include <iostream> #include <fstream> #include <vector> using namespace std; bool compFun(int x, int y) { int temp, i = 0; while (true) { temp = 1 << i; if (temp&x > temp&y) {

USACO Section 2.2 Party Lamps

/* ID: lucien23 PROG: lamps LANG: C++ */ /* * 此题的技巧之处就是需要注意到任何button只要按下2的倍数次就相当于没有按 * 所以其实只需要考虑4个按钮,每个按钮是否被有效按下过一次就好 * 直接使用枚举法,一共只有2^4=16种情况 * 对于每种情况需要知道被按下的有效次数(也就是被按下过的按钮数),必须满足 * (C-有效次数)%2=0才行,这样其他次数才能视为无效 * 然后验证各种情况是否符合要求,将符合要求的情况按序输出即可 */ #inc

USACO Section 2.2 Runaround Numbers

/* ID: lucien23 PROG: runround LANG: C++ */ #include <iostream> #include <fstream> #include <cstring> using namespace std; int main() { ifstream infile("runround.in"); ofstream outfile("runround.out"); if(!infile || !

USACO Section 2.2 Preface Numbering

/* ID: lucien23 PROG: preface LANG: C++ */ #include <iostream> #include <fstream> #include <string> #include <map> using namespace std; int main() { ifstream infile("preface.in"); ofstream outfile("preface.out")

[USACO]控制公司 Controlling Companies

玄妙的搜索 题目描述 有些公司是其他公司的部分拥有者,因为他们获得了其他公司发行的股票的一部分.(此处略去一句废话)据说,如果至少满足了以下三个条件之一,公司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),表明公

USACO Section2.3 Controlling Companies 解题报告 【icedream61】

concom解题报告------------------------------------------------------------------------------------------------------------------------------------------------[题目] 有至多100个公司,每个公司可能会有很多子公司,请你输出每个公司有哪些子公司. B是A的子公司,有以下两种情况: 1. A拥有B超过50%的股份 2. A某些子公司(包括A自己)各拥

usaco Controlling Companies

题意是,一个公司A要想可以控制另外一个公司B,必须满足一下三个条件之一 1.A等于B.也就是自己控制自己. 2.A拥有B的超过百分之50的股份. 3.A控制的所有公司拥有B的股份和超过百分之50. 求输出所有公司之间的控制关系.不输出自己控制自己的情况. 看见求任意两点之间的控制关系,先想到了Floyd,但是好像用不了,后来就直接按着题意写了一下,wa了之后,发现公司的间接控制关系可以继续拓展.然后改了一下. 我给出的算法类似于bellman-ford,通过变量m控制每次间接通过新增的点数来拓展