noip第33课作业
- 1. 排座椅
【问题描述】
上课的时候总会有一些同学和前后左右的人交头接耳,这是令小学班主任十分头疼的一件事情。不过,班主任小雪发现了一些有趣的现象,当同学们的座次确定下来之后,只有有限的D对同学上课时会交头接耳。
同学们在教室中坐成了 M 行 N 列,坐在第i行第j列的同学的位置是 (i,j) ,为了方便同学们进出,在教室中设置了 K 条横向的通道, L 条纵向的通道。于是,聪明的小雪想到了一个办法,或许可以减少上课时学生交头接耳的问题:她打算重新摆放桌椅,改变同学们桌椅间通道的位置,因为如果一条通道隔开了 2 个会交头接耳的同学,那么他们就不会交头接耳了。
请你帮忙给小雪编写一个程序,给出最好的通道划分方案。在该方案下,上课时交头接耳的学生的对数最少。
输入格式:
第一行,有 5 个用空格隔开的整数,分别是 M,N,K,L,D(2≤N,M≤1000,0≤K<M,0≤L<N,D≤2000)
接下来的 D行,每行有 4个用空格隔开的整数。第 i 行的 4 个整数 Xi,Yi,Pi,Qi,表示坐在位置 (Xi,Yi) 与 (Pi,Qi) 的两个同学会交头接耳(输入保证他们前后相邻或者左右相邻)。
输入数据保证最优方案的唯一性。
输出格式:
共两行。
第一行包含 K个整数 a1,a2,…,aK,表示第 a1 行和 a1+1 行之间、第 a2 行和 a2+1 行之间、…、第 aK 行和第 aK+1 行之间要开辟通道,其中 ai<ai+1,每两个整数之间用空格隔开(行尾没有空格)。
第二行包含 L 个整数 b1,b2,…,bL ,表示第 b1 列和 b1+1 列之间、第 b2 列和b2+1 列之间、…、第 bL 列和第 bL+1 列之间要开辟通道,其中 bi<bi+1 ,每两个整数之间用空格隔开(列尾没有空格)。
【输入样例】
4 5 1 2 3
4 2 4 3
2 3 3 3
2 5 2 4
【输出格式】
2
2 4
#include<iostream>
#define N 1010
using namespace std;
int m,n,k,l,d,x,y;
int fx,fy,ansk,ansl,maxk = -,maxl = -;
int vist[N][N],ak[N],al[N];
void findk(){//查找行
while(k--){
for(int i = ; i < m; i++){
if(ak[i] != ){
for(int j = ; j < n; j++){
if(vist[i][j] && vist[i+][j]){
ansk++;
}
}
if(ansk > maxk){
maxk = ansk;
fx = i;
ansk = ;
}
}
}
ak[fx] = ;
}
}
void findl(){
while(l--){ // 查找列
for(int i = ; i < n; i++){
if(al[i] != ){
for(int j = ; j < m; j++){
if(vist[j][i] && vist[j][i+]){
ansl++;
}
}
if(ansl > maxl){
maxl = ansl;
fy = i;
ansl = ;
}
}
}
al[fy] = ;
}
}
void print(){
for(int i = ; i <= m; i++){
if(ak[i]){
cout << i << " ";
}
}
cout << endl;
for(int i = ; i <= n; i++){
if(al[i]){
cout << i << " ";
}
}
}
int main()
{
cin >> m >> n >> k >> l >> d;
for(int i = ; i <= *d; i++){
cin >> x >> y;
vist[x][y] = ;
}
findk();
findl();
print();
return ;
}
/*
4 5 1 2 3
4 2 4 3
2 3 3 3
2 5 2 4 */
- 2. 活动安排问题
【问题描述】
设有n(n<=100000)个活动的集合E={1,2,…,n},其中每个活动都要求使用同一资源,如演讲会场等,而在同一时间内只有一个活动能使用这一资源。每个活动i都有一个要求使用该资源的起始时间si和一个结束时间fi,且si <fi 。如果选择了活动i,则它在半开时间区间[si, fi)内占用资源。若区间[si, fi)与区间[sj, fj)不相交,则称活动i与活动j是相容的。也就是说,当si≥fj或sj≥fi时,活动i与活动j相容。
活动安排问题就是要在所给的活动集合中选出最大的相容活动子集合。
输入
每行2个整数(100000以内),用空格间隔。表示每个活动的起始和结束时间。最后一行是2个0,表示所有输入的结束。
输出
一个整数,表示最多能安排几个活动。
【样例输入】
1 2
1 4
1 3
2 3
0 0
【样例输出】
2
#include<iostream>
#include<algorithm>
using namespace std;
struct data{
int b,d;
}a[];
int gz(const data &a,const data &b)
{
if(a.d<b.d)return ;
else return ;
}
int main()
{
int i=;
while(cin>>a[i].b>>a[i].d)
{
if(a[i].b==&&a[i].d==){i--;break;}
i++;
}
sort(a,a+i,gz);
int end=,ans=;
for(int j=;j<=i;j++)
if(a[j].b>=end)
{
end=a[j].d;
ans++;
}
cout<<ans;
return ;
}
/*
1 5
1 3
2 3
3 4
6 7
1 4
8 9
0 0 */
【问题描述】
在一个果园里,多多已经将所有的果子打了下来,而且按果子的不同种类分成了不同的堆。多多决定把所有的果子合成一堆。每一次合并,多多可以把两堆果子合并到一起,消耗的体力等于两堆果子的重量之和。可以看出,所有的果子经过n-1次合并之后,就只剩下一堆了。多多在合并果子时总共消耗的体力等于每次合并所耗体力之和。因为还要花大力气把这些果子搬回家,所以多多在合并果子时要尽可能地节省体力。假定每个果子重量都为1,并且已知果子的种类数和每种果子的数目,你的任务是设计出合并的次序方案,使多多耗费的体力最少,并输出这个最小的体力耗费值。例如有3种果子,数目依次为1,2,9。可以先将1、2堆合并,新堆数目为3,耗费体力为3。接着,将新堆与原先的第三堆合并,又得到新的堆,数目为12,耗费体力为12。所以多多总共耗费体力=3+12=15。可以证明15为最小的体力耗费值。
输入:
输入两行,第一行是一个整数n(1< =n< =10000),表示果子的种类数。第二行包含n个整数,用空格分隔,第i个整数ai(1< =ai< =20000)是第i种果子的数目。
输出:
输出包括一行,这一行只包含一个整数,也就是最小的体力耗费值。输入数据保证这个值小于2^31。
【输入样例】
3
1 2 9
【输出格式】
15
#include<iostream>
#include<algorithm>
using namespace std;
int a[],n;
void df(int x)
{
int i,t,q;
q=x;
for(i=q+;i<=n;i++)
{
if(a[i]<a[q])
q=i;
}
swap(a[x],a[q]);
}
int main()
{
int i,sum;
while(cin >> n)
{
sum=;
for(i=;i<=n;i++)
cin >> a[i];
df();
df();
for(i=;i<=n;i++)
{
a[i]+=a[i-];
sum+=a[i];
df(i);
df(i+);
}
cout << sum;
}
return ;
}
/*
3
1 3 9
17 4
1 2 3 4
19 5
1 2 8 9 15
69 2
1 9 2
10 2 */
noip第33课作业的更多相关文章
- noip第22课作业
1. 数字分解 [问题描述] 任何一个大于1的自然数n,总可以拆分成若干个小于n的自然数之和,当n等于5时有6种拆分方法: 5=1+1+1+1+1 5=1+1+1+2 5=1+1+3 5=1+2+ ...
- noip第5课作业
1. 计算税收 [问题描述] 对某产品征收税金,在产值1万元以上收税5%:在1万元以下但在5000元或者以上的征收税3%:在5000元以下但在1000元或以上征收税2%:1000元以下的免收税 ...
- noip第8课作业
1. 计算书费 [问题描述]下面是一个图书的单价表: 计算概论 28.9 元/本 数据结构与算法 32.7 元/本 数字逻辑 45.6元/本 C++程序设计教程 78 元/本 人工智能 35 ...
- noip第34课作业
1. 信息加密 [问题描述] 在传递信息的过程中,为了加密,有时需要按一定规则将文本转换成密文发送出去.有一种加密规则是这样的:1. 对于字母字符,将其转换成其后的第3个字母.例如:A→D,a→ ...
- noip第29课作业
1. 钢条切割 [问题描述] 一家公司购买长钢条,将其切割成短钢条出售,切割本身没有成本,长度为i的短钢条的价格为Pi.那给定一段长度为n的钢条和一个价格表Pi,求钢条的切割方案使得收益Rn最大. ...
- noip第28课作业
分段数列 [问题描述] 对于给定的一个长度为N的正整数数列A[i],现要将其分成连续的若干段,并且每段和不超过M(可以等于M),问最少能将其分成多少段使得满足要求. 输入格式: 输入第1行包含两个正整 ...
- noip第27课作业
1. 繁忙的都市 [问题描述] 城市C是一个非常繁忙的大都市,城市中的道路十分的拥挤,于是市长决定对其中的道路进行改造.城市C的道路是这样分布的:城市中有n个交叉路口,有些交叉路口之间有道路相连,两个 ...
- noip第26课作业
1. 信使 [问题描述] 战争时期,前线有n个哨所,每个哨所可能会与其他若干个哨所之间有通信联系.信使负责在哨所之间传递信息,当然,这是要花费一定时间的(以天为单位).指挥部设在第一个哨所.当指 ...
- noip第25课作业
1. 求一个有向图所有顶点入度的和 输入有向图的顶点个数,边数以及各顶点之间的关联情况,要求求出这个有向图的所有顶点入度的总和. [输入格式] 第1行:2个空格分开的整数n(2<=n< ...
随机推荐
- 关于transform-style:preserve-3d的些许明了
父元素要添加属性transform-style:preserve-3d;和transform:perspective(800px);还有相对定位 首先设置子元素 具有3D属性,然后再设置视角与3D元素 ...
- c# 24种设计模式5原型模式(Prototype)
前言 原型模式其实C# Object中已经提供了一个Clone( )方法,平时很少用到,最近读Retrofit源码时候看到有这种使用方式. 定义 原型模式就是在系统clone()标记的基础上,对Clo ...
- 安装composer,以及通过composer安装laravel
1安装composer http://docs.phpcomposer.com/00-intro.html#Installation-Windows中选择windows安装 下载并且运行 Compos ...
- 探索未知种族之osg类生物---呼吸分解之advance
回顾 我们用了两节的内容才堪堪讲解完ViewerBase::frame()函数中调用的realize()---Viewer:: realize()函数.我们简单的总结就是Viewer:: realiz ...
- CentOS6.2网卡绑定配置
下面主要介绍在CentOS6.2下使用系统自带的bonding进行网卡绑定的详细步骤,在此之前你可以看一下Linux网卡绑定探析,你也可以使用网卡绑定的脚本进行网卡绑定操作. 注意:请在配置前关闭Ne ...
- invalid END header解决方法
我在Windows上的eclipse开发了一个java web项目,然后压缩成war包,通过ftp发送到Linux服务器上,Tomcat先shutdown,再startup.按理说,会在webapps ...
- vs2010打开qt的.pro文件时错误解决办法
注意:qt creator工程中一般都已经存在*.pro文件,里面存放着一些自己配置的包含头文件和lib库文的信息,最好不要再重新使用qmake -project生成,若重新生成,则可能要重新增加配置 ...
- 糟糕的@@identity,SCOPE_IDENTITY ,IDENT_CURRENT
在某数据库里面,某甲用@@identity来获取最近插入的id值,当在多人环境,发生获取到null值的问题. 那么@@identity是否有存在的必要? 感觉像生个孩子,多了个指头. 有的数据库的ge ...
- jquery ajax 全局事件
jquery的ajax方法的全部全局事件:(不管是$.ajax().$.get().$.load().$.getJSON()等都会默认触发全局事件) ajaxStart:ajax请求开始前 ajaxS ...
- 几种开源的TCP/IP协议栈分析
1:BSD TCP/IP协议栈,BSD栈历史上是其他商业栈的起点,大多数专业TCP/IP栈(VxWorks内嵌的TCP/IP栈)是BSD栈派生的.这是因为 BSD栈在BSD许可协议下提供了这些专业栈的 ...