SZU:B36 Reading books
2014-02-15 15:33
120 查看
Description
In the summer vacation, LRJ wants to improve himself in computer science. So he finds out N books of computer science in the school library. The books are numbered from 0 to N-1.To finish reading the i-th book, it takes LRJ time[i] minutes. But some books are similar in the content. If the i-th book and the j-th book are similar, then if LRJ has finished reading the i-th book, it will take him only
![](http://acm.szu.edu.cn/wiki/images/math/4/9/e/49eee5fb28cdc2a951196a7d52ebdc85.png)
minutes to finish reading the j-th book. Of course if LRJ has finished reading the j-th book, it will take him only
![](http://acm.szu.edu.cn/wiki/images/math/7/8/2/782cb5e9b8fabc84a9ca29fc6bcfbdb1.png)
minutes to finish reading the i-th book. Now you are asked to tell LRJ the minimal total time to finish reading all the N books.
Input
The first line contains two integers![](http://acm.szu.edu.cn/wiki/images/math/c/1/7/c178f9f9243070b5e0feff528fd0c143.png)
and
![](http://acm.szu.edu.cn/wiki/images/math/2/2/4/224c70b34383b7e5aff2963d04be9725.png)
. N is the total number of books. M is the number of pairs which are similar.
Then the following N lines describe
![](http://acm.szu.edu.cn/wiki/images/math/1/4/5/1459b0ed33eba9589b4a16d6b24a83d0.png)
.
Next comes M lines, each contains two integer (i,j), indicating that the i-th book and the j-th book are similar.
Input is ended with EOF.
Output
For each test case, just output the minimal total time on a single line.Sample Input
2 1 6 10 0 1 3 2 1 2 3 0 1 1 2 3 1 2 4 6 0 1
Sample Output
11 3 10
Hint:For the first test case, if LRJ read the books in the order (0, 1), then the total time = 6+10/2=11; If in the order (1, 0), then the total time =10+ 6/2=13.
Ps :这道题我看错题意了,导致一直无法AC,而且被无法言喻的提示误导了。原来这个(0,1)顺序是自动找出i,j 书最少时间的,思想错了,导致做了一下午无法解决
其实少了dd这个老师,挺难过的说。
1 #include<stdio.h> 2 int num[120]; 3 int root(int n) 4 { 5 if(n!=num ) 6 n=root(num ); 7 return n; 8 } 9 int main() 10 { 11 int m,n,i,sum,a,b,time[120]; 12 while(scanf("%d%d",&m,&n)!=EOF){ 13 for(i=0;i<m;i++){ 14 scanf("%d",&time[i]); 15 num[i]=i; 16 } 17 for(i=0;i<n;i++){ 18 scanf("%d%d",&a,&b); 19 a=root(a); 20 b=root(b); 21 if(time[a]<time[b]) 22 num[b]=a; 23 else num[a]=b; 24 } 25 sum=0; 26 for(i=0;i<m;i++){ 27 if(num[i]==i) 28 sum+=time[i]; 29 else sum+=time[i]/2; 30 } 31 printf("%d\n",sum); 32 } 33 return 0; 34 }
相关文章推荐
- SZU:B36 Reading books
- Android学习笔记_36_ListView数据异步加载与AsyncTask
- 36 Android Activity跳转动画 获取当前版本
- Python 学习入门(36)—— @property属性
- NYOJ 36 最长公共子序列
- 【九度OJ1348】|【剑指offer36】数组中的逆序对
- NYOJ 36 最长公共子序列
- 改善C#编程的50个建议(36-40)
- 笔记36--界面跳转效果
- project euler Problem 36
- 36、实例 jQuery过滤器之可见过滤器
- RQNOJ-36 数石子
- LeetCode 36 Populating Next Right Pointers in Each Node
- 36_01_Linux集群系列之一——集群基础概念
- Effective C++ 35,36,37
- Yii框架官方指南系列36——扩展Yii:使用第三方库
- [C++]LeetCode: 36 Symmetric Tree
- 【转】每天一个linux命令(36):diff 命令
- NYOJ 36 最长公共子序列
- JAVA学习笔记36——泛型2:泛型继承、擦除+泛型接口+泛型无多态、通配符