竞赛于 2016-4-19 T1,公司控制(usaco 原题)
来源:互联网 发布:手机控制wifi软件 编辑:程序博客网 时间:2024/05/20 12:50
该题为USACO上原题,乍一看挺麻烦,其实可直接搜索。设a[i][j]为i公司控制j公司的股份,con[i][j]表示i公司是否控制j公司。首先枚举每个i,j公司,对于每个i能控制的公司j,则要继续枚举j占有股份的公司k,计算其股份和,跟新a[i][k],然后添加i控制j,而每次添加新的控制关系则要再更新一次所有关系。时间复杂度小于O(n^4),对于本题完全能过。
#include<iostream>#include<cstdio>#include<cstdlib>using namespace std;int con[105][105],flag;int a[105][105];int n;void init(){ freopen("control.in","r",stdin); freopen("control.out","w",stdout);}void readdata(){ int x,y,z; scanf("%d",&n); for (int i=1;i<=n;i++) { scanf("%d%d%d",&x,&y,&z); a[x][y]=z; }}void work(){ for (int i=1;i<=100;i++) { flag=1; while (flag)//每次添加新的控制关系,则要再更新所有关系 { flag=0; for (int j=1;j<=100;j++) if (a[i][j]>50&&!con[i][j]) //如果i能控制j,且没有更新过 { flag=1; for (int k=1;k<=100;k++) //更新a[i][k]为其控制的j占有所有公司k的股份和 { a[i][k]+=a[j][k]; if (a[i][k]>100) a[i][k]=100; } con[i][j]=1;//更新i控制j } } } flag=1; for (int i=1;i<=100;i++) for (int j=1;j<=100;j++) if (con[i][j]&&i!=j) { flag=0; printf("%d %d\n",i,j); } if(flag)printf("0\n");}int main(){ init(); readdata(); work(); return 0;}
0 1
- 竞赛于 2016-4-19 T1,公司控制(usaco 原题)
- usaco 2.3.5控制公司
- USACO 2.3 控制公司 (DFS)
- USACO 2.4.2 穿越栅栏(原题) 解题报告
- (原)控制反转
- 采药问题(NOIP竞赛原题)
- 求先序序列(NOIP竞赛原题)
- 求先序序列(NOIP竞赛原题)
- 【USACO题库】2.3.5 Controlling Companies控制公司
- JZOJ1270.【USACO题库】2.3.5 Controlling Companies控制公司
- (Step1-500题)UVaOJ+算法竞赛入门经典+挑战编程+USACO
- 最小公倍数与最大公约数问题(NOIP竞赛原题)
- 装箱问题(NOIP竞赛原题)(动态规划)
- 装箱问题(NOIP竞赛原题)(动态规划)
- 最小公倍数与最大公约数问题(NOIP竞赛原题)
- [ICM ] 2014全美交叉学科竞赛原题及翻译
- 【NOIP 模拟题】[T1]return(模拟)
- 【NOIP 模拟题】[T1] 等差数列(dp)
- glDrawElements
- 获取android手机的相关信息
- 内容提供器Demo
- Xutils3使用心得
- 利用Retrofit执行Post、Get请求,通俗易懂
- 竞赛于 2016-4-19 T1,公司控制(usaco 原题)
- iOS基于B站的IJKPlayer框架的流媒体探究
- Android 日历控件WeekCalendar
- Matlab之fopen、fprintf函数
- C++新特性学习笔记
- 配置Log4j(很详细)
- Android 驱动开发系列三
- SP共享数据(程序B读取程序A的SP数据)
- C#中两个Form之间传值的一种方法