竞赛于 2016-4-19 T1,公司控制(usaco 原题)
2016-04-19 16:41
134 查看
该题为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),对于本题完全能过。
加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; }
加i控制j,而每次添加新的控制关系则要再更新一次所有关系。时间复杂度小于O(n^4),对于本题完全能过。
相关文章推荐
- 获取android手机的相关信息
- Cocos2d-x 如何播放动画
- Java中HashMap的key的Hash值修改问题
- 小细节
- Python中关于封装,继承,多态的表述
- Android之微信支付宝开发
- Java Maven web工程调试
- theano tutorial(七)稀疏矩阵
- ppt转换成pdf在线转换方法
- wechat 微信webView 文本输入
- VC++中的DDX和DDV
- 冒泡排序的另一种写法
- C#获取命令行输出内容的方法
- [转]ACM-ICPC竞赛算法类型
- android 沉浸式状态栏(像ios那样的状态栏与应用统一颜色样式)
- 自动检测memcached进程,不存在则自动重启(脚本)
- 欢迎使用CSDN-markdown编辑器
- SQL-使用视图
- An internal error occurred during: "Building workspace". GC overhead limit exceeded
- 逻辑回归梯度下降法详解