1355. 读书

★   输入文件:reading.in   输出文件:reading.out   简单对比
时间限制:1 s   内存限制:128 MB

【题目描述】

放暑假了,CHH想趁假期提高一下自己的计算机水平,于是他从学校图书馆借了N本计算机科学方面的书,这N本书的编号依次为0~N-1。

读完第i本书,CHH需要花费time[i]分钟,但是有一些书的内容是相近的,如果第i本书与第j本书内容相近,那么如果CHH读完了第i本书,再读第j本书的时候只需要floor(time[j]/2)分钟的时间即可(其中floor()表示对括号中的式子进行下取整);当然,如果CHH先读完了第j本书,那么再读第i本书的时候只需floor(time[i]/2)的时间。现在你的任务是告诉CHH,他最少可以用多少分钟读完这N本书。

【输入格式】

第一行有两个整数N(0<=N<=100)和M(0<=M<=N(N-1)/2)。N为书的总数,有M对书内容相近。

接下来有N行,分别表示time[0],time[1],...及time[N-1],(1<=time[i]<=10^5)。

再接下来有M行,每行有两个整数(i,j),表示第i本书与第j本书内容相近。

输入文件以N=0,M=0表示结束。

【输出格式】

对于每组测试数据,输出仅一行,即最少时间。

【样例输入】

2 1
6
10
0 1
3 2
1
2
3
0 1
1 2
3 1
2
4
6
0 1
0 0

【样例输出】

11
3
10

【提示】

对于第一组数据,如果CHH读的顺序为(0,1),则总的时间为6+10/2=11,如果读的顺序为(1,0),则总的读书时间为10+6/2=13.

思路:

  题目中提及:

     两本书之间可能内容相近,所以我们可以采用并查集,然后贪心选一个集合中用时最小的书,剩下的除2加入总时间即可。

     故我们可以用kruskal来做这道题

坑点:

  1)若出现m==0 但是 n!=0,此时不要退出程序!!!

  2)要从0开始进行标号

上代码:

#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
using namespace std; const int N = ;
const int M = ;
int n,m,ans;
int t[N],dad[N];
bool vis[N]; int getdad(int x)
{return dad[x] == x ? x : dad[x] = getdad(dad[x]);} void kruskal()
{
while(true)
{
int flag=-;
int tmp[]={},cnt=;
for(int i=;i<n;i++)
{
if(flag==- && !vis[i])
{
vis[i]=true;
flag=getdad(i);
tmp[++cnt]=t[i];
}
else if(flag!=- && !vis[i] && getdad(i)==flag)
{
vis[i]=true;
tmp[++cnt]=t[i];
}
}
if(!cnt)
{
cout<<ans<<endl;
break;
}
sort(tmp+,tmp++cnt);
ans+=tmp[];
for(int i=;i<=cnt;i++)
ans+=floor(tmp[i]>>);
}
} void chu()
{
ans=;
memset(t,,sizeof(t));
memset(vis,false,sizeof(vis));
memset(dad,,sizeof(dad));
} int main()
{
freopen("reading.in","r",stdin);
freopen("reading.out","w",stdout);
while(cin>>n>>m)
{
if(n== && m==)
break;
chu();
for(int i=;i<n;i++)
cin>>t[i],dad[i]=i;
for(int i=,u,v;i<m;i++)
{
cin>>u>>v;
int f1=getdad(u),f2=getdad(v);
if(f1!=f2)
dad[f1]=f2;
}
kruskal();
}
return ;
}

cogs1355. 读书的更多相关文章

  1. 读书笔记汇总 - SQL必知必会(第4版)

    本系列记录并分享学习SQL的过程,主要内容为SQL的基础概念及练习过程. 书目信息 中文名:<SQL必知必会(第4版)> 英文名:<Sams Teach Yourself SQL i ...

  2. 使用po模式读取豆瓣读书最受关注的书籍,取出标题、评分、评论、题材 按评分从小到大排序并输出到txt文件中

    #coding=utf-8from time import sleepimport unittestfrom selenium import webdriverfrom selenium.webdri ...

  3. 【读书】PHP程序员要读的书目(不断完善中)

    本文地址 分享提纲: 1. PHP 2. Linux 3. Apache/Nginx 4. Mysql 5.设计模式/架构 6. 缓存并发 7. 其他语言 8. 代码基础 9. 大前端 10. 管理生 ...

  4. 《图解HTTP》读书笔记

    目前国内讲解HTTP协议的书是在太少了,记忆中有两本被誉为经典的书<HTTP权威指南>与<TCP/IP详解,卷1>,但内容晦涩难懂,学习难度较大.其实,HTTP协议并不复杂,理 ...

  5. 《图解TCP/IP》读书笔记

    一.国际惯例:书托 这是一本图文并茂的网络管理技术书籍,旨在让广大读者理解TCP/IP的基本知识.掌握TCP/IP的基本技能. 书中讲解了网络基础知识.TCP/IP基础知识.数据链路.IP协议.IP协 ...

  6. 读书笔记--SQL必知必会18--视图

    读书笔记--SQL必知必会18--视图 18.1 视图 视图是虚拟的表,只包含使用时动态检索数据的查询. 也就是说作为视图,它不包含任何列和数据,包含的是一个查询. 18.1.1 为什么使用视图 重用 ...

  7. 【读书笔记】2016.12.10 《构建高性能Web站点》

    本文地址 分享提纲: 1. 概述 2. 知识点 3. 待整理点 4. 参考文档 1. 概述 1.1)[该书信息] <构建高性能Web站点>: -- 百度百科 -- 本书目录: 第1章 绪论 ...

  8. [转]ThoughtWorks(中国)程序员读书雷达

    http://agiledon.github.io/blog/2013/04/17/thoughtworks-developer-reading-radar/#rd?sukey=f64bfa68330 ...

  9. 《深入理解Java内存模型》读书总结

    概要 文章是<深入理解Java内容模型>读书笔记,该书总共包括了3部分的知识. 第1部分,基本概念 包括"并发.同步.主内存.本地内存.重排序.内存屏障.happens befo ...

随机推荐

  1. linux 查找大文件

    查看磁盘使用情况:df -h [root@iZwz9gs2zseivevv1k5vnkZ /]# df -h Filesystem Size Used Avail Use% Mounted on /d ...

  2. X86逆向3:通过修改关键CALL破解

    软件逆向第一课中我们通过爆破的方式直接破解了程序的登录限制,但这一种方式很不合理,因为你只是破解了登录这一处的验证,如果程序内部还有其他的验证那么你需要再次爆破第二个验证,显然这种方式是很烦人的,如果 ...

  3. 24-Perl 数据库连接

    1.Perl 数据库连接本章节我们将为大家介绍 Perl 数据库的连接.Perl 5 中我们可以使用 DBI 模块来连接数据库.DBI 英文全称:Database Independent Interf ...

  4. JDBC24homework

    编写程序: 创建一个类DBTools,在DBTools中创建一个方法find,find方法用于对数据库进行查询操作,现在要求将结果集封装成数组线性表嵌套数组的形式: ArrayList<Stri ...

  5. oracle sqlplus执行sql语句字符集问题

    因为业务需要,现将一些包含中文的insert语句导入到oracle数据库中,由于数据量比较大,通过pl/sql*plus导入时非常慢(实测1.5M的文件大概执行20分钟),现在oracle服务器sql ...

  6. O025、OpenStack 通用设计思路

    参考https://www.cnblogs.com/CloudMan6/p/5427981.html   API 前端服务   每个OpenStack组件可能包含若干子服务,其中必定有一个API服务负 ...

  7. centos7上的firewalld 的使用

    #centos7上的firewalld 的使用 一.firewalld的基本启动关闭命令 启动服务------systemctl start firewalld 关闭服务------systemctl ...

  8. 将java文件编译成class文件

    一般情况下,在myeclipse中保存java文件后会自动编译成class文件,但是这种情况只能编译当前工程的java文件,但是如果需要编译不是一个工程的java文件,比如在网上拷贝的java文件改如 ...

  9. ztree树id、pid转成children格式的(待整理完整)

    山铝菜单 因为菜单选用了bootstrap treeview ,而格式需要是children类似的格式 var nodes = [ {name: "父节点1", children: ...

  10. SpringBoot设置首页(默认页)跳转

    SpringBoot设置首页(默认页)跳转 方案1:controller里添加一个"/"的映射路径 @RequestMapping("/")public Str ...