2127 - 2.3.4 Controlling Companies (concom)

通过次数

0

提交次数

0

时间限制 : 1 秒 内存限制 : 128 MB

2.3.4 Controlling Companies (concom)

concom.pas/c/cpp


<span style="font-size:16px;">有些公司是其他公司的部分拥有者,因为他们获得了其他公司发行的股票的一部分。(此处略去一句废话)据说,如果至少满足了以下三个条件之一,公司A就可以控制公司B了:</span>

<li>
	<span style="font-size:16px;">公司A = 公司B。</span>
</li>
<li>
	<span style="font-size:16px;">公司A拥有大于50%的公司B的股票。</span>
</li>
<li>
	<span style="font-size:16px;">公司A控制K(K &gt;= 1)个公司,记为C</span><sub><span style="font-size:16px;">1</span></sub><span style="font-size:16px;">, ..., C</span><sub><span style="font-size:16px;">K</span></sub><span style="font-size:16px;">,每个公司C</span><sub><span style="font-size:16px;">i</span></sub><span style="font-size:16px;">拥有x</span><sub><span style="font-size:16px;">i</span></sub><span style="font-size:16px;">%的公司B的股票,并且x</span><sub><span style="font-size:16px;">1</span></sub><span style="font-size:16px;">+ .... + x</span><sub><span style="font-size:16px;">K</span></sub><span style="font-size:16px;">&nbsp;&gt; 50%。</span>
</li>

<span style="font-size:16px;">给你一个表,每行包括三个数(i,j,p);表明公司i享有公司j的p%的股票。计算所有的数对(h,s),表明公司h控制公司s。至多有100个公司。</span>

<span style="font-size:16px;">写一个程序读入N组数(i,j,p),i,j和p是都在范围(1..100)的正整数,并且找出所有的数对(h,s),使得公司h控制公司s。</span>

<span class="mw-headline" id=".E8.BE.93.E5.85.A5.E6.A0.BC.E5.BC.8F" style="font-size:16px;">输入格式</span>

<span style="font-size:16px;">第一行: N,表明接下来三个数的数量,即(i,j,p)的数量。</span>

<span style="font-size:16px;">第二行到第N+1行: 每行三个整数作为一个三对数(i,j,p),表示i公司拥有j公司 p%的股份。</span>

<span class="mw-headline" id=".E6.A0.B7.E4.BE.8B.E8.BE.93.E5.85.A5_.28file_concom.in.29" style="font-size:16px;">样例输入 (file concom.in)</span>

3
1 2 80
2 3 80
3 1 20

<span class="mw-headline" id=".E8.BE.93.E5.87.BA.E6.A0.BC.E5.BC.8F" style="font-size:16px;">输出格式</span>

<span style="font-size:16px;">输出零个或更多个的控制其他公司的公司。每行包括两个整数A、B,表示A公司控制了B公司。将输出的数对以升序排列。</span>

<span style="font-size:16px;">请不要输出控制自己的公司(应该是不输出自己,互相控制的公司还是要输出的)。</span>

<span class="mw-headline" id=".E6.A0.B7.E4.BE.8B.E8.BE.93.E5.87.BA_.28file_concom.out.29" style="font-size:16px;">样例输出 (file concom.out)</span>

1 2
1 3
2 3

题目输入

题目输出

输入/输出样例

输入格式


                        

输出格式


                        

C语言解答

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int a[101][101],b[101],count[101],n;
void dfs(int i)
{
	b[i]=1;
	int j;
	for(j=1;j<=100;j++)
	{
		count[j]+=a[i][j];
	}
	for(j=1;j<=100;j++)
	{
		if(i!=j&&!b[j]&&count[j]>=50)
		{
			dfs(j);
		}
	}
}
int main()
{
   int i,A,B,C,j;
   scanf("%d",&n);
   for(i=1;i<=n;i++)
   {
   	  scanf("%d%d%d",&A,&B,&C);
   	  a[A][B]=C;
   }
   	  for(i=1;i<=100;i++)
   	  {
      memset(b,0,sizeof(b)); 
   	  memset(count,0,sizeof(count));
   	  dfs(i);
   	  for(j=1;j<=100;j++)
   	  {
   	  	if(i!=j&&count[j]>=50)
   	  	{
   	  		printf("%d %d\n",i,j);
		}
	   }
	  }
	return 0;
 } 

C++解答

#include <iostream>
#include <iomanip>
#include <algorithm>
#include <string>
#include <cstring>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <ctime>
using namespace std;
int N,gs[105][105];
int main()
{
	int i,j,a,b,c;
	scanf("%d",&N);
	for (i=0;i<N;i++)
	{
		scanf("%d%d%d",&a,&b,&c);
		gs[a-1][b-1]=c;
	}
	for (i=0;i<N;i++)
	{
		for (j=0;j<N;j++)
		{
			if (gs[i][j]>50)
				for (a=0;a<N;a++)
					gs[i][a]+=gs[j][a];
		}
	}
	for (i=0;i<N;i++)
	{
		for (j=0;j<N;j++)
		{
			if (gs[i][j]>50&&i!=j)
				printf("%d %d\n",i+1,j+1);
		}
	}
	return 0;
}