杭电OJ题 1557 权利指数 解题报告
来源:互联网 发布:算法新解pdf 编辑:程序博客网 时间:2024/06/05 10:35
权利指数
Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 492 Accepted Submission(s): 337
Total Submission(s): 492 Accepted Submission(s): 337
Problem Description
在选举问题中,总共有n个小团体,每个小团体拥有一定数量的选票数。如果其中m个小团体的票数和超过总票数的一半,则此组合为“获胜联盟”。n个团体可形成若干个获胜联盟。一个小团体要成为一个“关键加入者”的条件是:在其所在的获胜联盟中,如果缺少了这个小团体的加入,则此联盟不能成为获胜联盟。一个小团体的权利指数是指:一个小团体在所有获胜联盟中成为“关键加入者”的次数。请你计算每个小团体的权利指数。
Input
输入数据的第一行为一个正整数T,表示有T组测试数据。每一组测试数据的第一行为一个正整数n(0<n<=20)。第二行有n个正整数,分别表示1到n号小团体的票数。
Output
对每组测试数据,在同一个行按顺序输出1到n号小团体的权利指数。
Sample Input
211075 7 4 8 6 7 5
Sample Output
116 22 16 24 20 22 16
————————————————————————————————————————————————————
先从小到大排序,然后DFS,应为如果没有排序,结果会丢失,原因是当在没有排序的情况下,当条件满足的时候就停止DFS,如果后面有数字满足条件,但可有可无的时候也算一种情况,没有考虑就错了
/**************************** *Name:权利指数.c *Tags:ACM water *Note:先从小到大排序,然后DFS,应为如果没有排序,结果会丢失,原因是当在没有排序的情况下,当条件满足的时候就停止DFS,如果后面有数字满足条件,但可有可无的时候也算一种情况,没有考虑就错了 ****************************/#include <stdio.h>void dfs(int, int);void count();int man[20][3];int group[20];int sum = 0;int n, g;int main(){ int t, i, s, j; scanf("%d", &t); while(t--) { scanf("%d", &n); sum = 0; for(i = 0; i < n; i++) { scanf("%d", &man[i][0]); man[i][1] = 0; man[i][2] = i; sum += man[i][0]; } if(n == 1) { printf("%d\n", 1); continue; } for(i = 0; i < n-1; i++) { for(j = 0; j < n-1-i; j++) {if(man[j][0] > man[j+1][0]) { s = man[j][0]; man[j][0] = man[j+1][0]; man[j+1][0] = s; s = man[j][2]; man[j][2] = man[j+1][2]; man[j+1][2] = s;} } } sum /= 2; for(i = 0; i < n; i++) { g = 0; s = man[i][0]; group[g++] = i; if(s > sum) {man[i][1] += 1; } else {dfs(i+1, s); } } for(i = 0; i < n-1; i++) { for(j = 0; j < n-1-i; j++) {if(man[j][2] > man[j+1][2]) { s = man[j][2]; man[j][2] = man[j+1][2]; man[j+1][2] = s; s = man[j][1]; man[j][1] = man[j+1][1]; man[j+1][1] = s;} } } printf("%d", man[0][1]); for(i = 1; i < n; i++) { printf(" %d", man[i][1]); } printf("\n"); } return 0;}void dfs(int i, int s){ int j; for(i = i; i < n; i++) { s += man[i][0]; group[g++] = i; if(s > sum) { for(j = 0; j < g; j++) {if((s - man[group[j]][0]) <= sum) { man[group[j]][1]++;} } } else { dfs(i+1, s); } s -= man[i][0]; g--; }}
- 杭电OJ题 1557 权利指数 解题报告
- 杭电OJ 1209题clock 解题报告
- 杭电OJ题 1106 排序 解题报告
- 杭电OJ 题 1209 Clock 解题报告
- 杭电OJ题 1236 排名 解题报告
- 杭电OJ题 1391 Number Steps 解题报告
- 杭电OJ题 1347 Grandpa is Famous解题报告
- 杭电OJ题 1361 Parencodings解题报告
- 杭电OJ题 1379 DNA Sorting解题报告
- 杭电OJ题 1390 Binary Numbers解题报告
- 杭电OJ题 1393 Weird Clock解题报告
- 杭电OJ题 Goldbach's Conjecture解题报告
- 杭电OJ题 1408 盐水的故事 解题报告
- 杭电OJ题 1412 {A} + {B} 解题报告
- 杭电OJ题 1444 Maya Calendar解题报告
- 杭电OJ题 1491 Octorber 21st 解题报告
- 杭电OJ题 1555 How many days?解题报告
- 杭电OJ题 1562 Guess the number解题报告
- gcc初学者命令
- Android 环境在ubuntu下的搭建
- AS3操作xml
- android:ListView使用总结
- HD OJ 1002Problem 大数相加
- 杭电OJ题 1557 权利指数 解题报告
- RC 资源文件
- 点击头部字母,滚动条跳转到相应的位置 jquery
- 【2013.1.24】我有一个梦想:有一天世界上全部电器都可以用一个充电器来充电——Adapter
- WIFI Calibration
- NesC学习经验总结:第三篇 如何调试NesC程序
- idr机制(32叉树)
- 理解WebKit和Chromium: 消息循环(Message Loop)
- NesC学习经验总结:第四篇 commands和events的用法与provide和use的关系