程序设计思维与实践 Week10 限时大模拟

A - 签到题

题目描述

TT有一个A×B×C的长方体。这个长方体是由A×B×C个1×1×1的小正方体组成的。

现在TT想给每个小正方体涂上颜色。

需要满以下三点条件:

每个小正方体要么涂成红色,要么涂成蓝色。
所有红色的小正方体组成一个长方体。
所有蓝色的小正方体组成一个长方体。
现在TT想知道红色小正方体的数量和蓝色小正方体的数量的差异。

你需要找到红色正方体的数量与蓝色正方体的数量差值的绝对值的最小值。
即min{|红色正方体数量 - 蓝色正方体数量|}。

输入格式

输入仅一行,三个数A B C (2≤A,B,C≤10^9)。

输出格式

输出一个数字。

即差值绝对值的最小值。

Simple Input 1
3 3 3

Simple Output 1
9

Simple Input 2
2 2 4

Simple Output 2
0

Simple Input 3
5 3 5

Simple Output 3
15

解题思路

  • 本题即 一个长方体沿平行于棱的方向切一刀分成两个,看两个中小正方形数目的差异
  • 使差值最小,则应尽可能平均分
  • 如果某一面的边为偶数或者面积为偶数,则可以平均分,答案为0
  • 如果没有哪一面满足,则选当前面最中间的位置,切一刀下去的差值是两条边的乘积;即找两条边乘积最小值即可。

完整代码

#include <iostream>
using namespace std;
long long a,b,c;
long long ab,ac,bc,Min;

int main()
{
std::ios::sync_with_stdio(false);
cin>>a>>b>>c;
ab=a*b;
ac=a*c;
bc=b*c;
Min=ab;
if(ab%2==0||ac%2==0||bc%2==0)
	 cout<<"0"<<endl;
else 
{if(Min>ac)
	Min=ac;
if(Min>bc)
	Min=bc;
	cout<<Min<<endl;
	

}
	return 0;

}

B - 团 队 聚 会

题目描述

TA团队每周都会有很多任务,有的可以单独完成,有的则需要所有人聚到一起,开过会之后才能去做。但TA团队的每个成员都有各自的事情,找到所有人都有空的时间段并不是一件容易的事情。

给出每位助教的各项事情的时间表,你的任务是找出所有可以用来开会的时间段。

输入格式

第一行一个数T(T≤100),表示数据组数。

对于每组数据,第一行一个数m(2 ≤ m ≤ 20),表示TA的数量。

对于每位TA,首先是一个数n(0≤ n≤100),表示该TA的任务数。接下来n行,表示各个任务的信息,格式如下

YYYY MM DD hh mm ss YYYY MM DD hh mm ss “some string here”

每一行描述的信息为:开始时间的年、月、日、时、分、秒;结束时间的年、月、日、时、分、秒,以及一些字符串,描述任务的信息。

数据约定

所有的数据信息均为固定位数,位数不足的在在前面补前导0,数据之间由空格隔开。

描述信息的字符串中间可能包含空格,且总长度不超过100。

所有的日期时间均在1800年1月1日00:00:00到2200年1月1日00:00:00之间。

为了简化问题,我们假定所有的月份(甚至2月)均是30天的,数据保证不含有不合法的日期。

注意每件事务的结束时间点也即是该成员可以开始参与开会的时间点。

输出格式

对于每一组数据,首先输出一行"Scenario #i:",i即表明是第i组数据。

接下来对于所有可以用来开会的时间段,每一个时间段输出一行。

需要满足如下规则:

在该时间段的任何时间点,都应该有至少两人在场。
在该时间段的任何时间点,至多有一位成员缺席。
该时间段的时间长度至少应该1h。
所有的成员都乐意一天24h进行工作。

举个例子,假如现在TA团队有3位成员,TT、zjm、hrz。

那么这样的时间段是合法的:会议开始之初只有TT和zjm,后来hrz加入了,hrz加入之后TT离开了,此后直到会议结束,hrz和zjm一直在场。

要求

输出满足条件的所有的时间段,尽管某一段可能有400年那么长。
时间点的格式为MM/DD/YYYY hh:mm:ss。
时间段的输出格式为"appointment possible from T0 to T1",其中T0和T1均应满足时间点的格式。
严格按照格式进行匹配,如果长度不够则在前面补前导0。
按时间的先后顺序输出各个时间段。
如果没有合适的时间段,输出一行"no appointment possible"。
每组数据末尾须打印额外的一行空行。

Simple Input

2
3
3
2020 06 28 15 00 00 2020 06 28 18 00 00 TT study
2020 06 29 10 00 00 2020 06 29 15 00 00 TT solving problems
2020 11 15 15 00 00 2020 11 17 23 00 00 TT play with his magic cat
4
2020 06 25 13 30 00 2020 06 25 15 30 00 hrz play
2020 06 26 13 30 00 2020 06 26 15 30 00 hrz study
2020 06 29 13 00 00 2020 06 29 15 00 00 hrz debug
2020 06 30 13 00 00 2020 06 30 15 00 00 hrz play
1
2020 06 01 00 00 00 2020 06 29 18 00 00 zjm study
2
1
1800 01 01 00 00 00 2200 01 01 00 00 00 sleep
0

Simple Output

Scenario #1:
appointment possible from 01/01/1800 00:00:00 to 06/25/2020 13:30:00
appointment possible from 06/25/2020 15:30:00 to 06/26/2020 13:30:00
appointment possible from 06/26/2020 15:30:00 to 06/28/2020 15:00:00
appointment possible from 06/28/2020 18:00:00 to 06/29/2020 10:00:00
appointment possible from 06/29/2020 15:00:00 to 01/01/2200 00:00:00

Scenario #2:
no appointment possible

解题思路

  • 本题变向的考察了时间的比较

  • 结果的端点 一定出现在各任务的起始、终止点上,所以只需要记录所有任务的起始、终止时间点,判断即可。

  • 输入时间之后,没用的信息(姓名、要做的事)用gets(char*)吸收掉。

  • 判断某个时间点是否符合要求,即判断符合条件的助教数目,符合条件分为以下情况

    • 助教的工作数目为0则
    • 助教第一个任务时间大于当前时间
    • 助教最后一个任务时间小于当前时间
    • 当前时间在TA[i]的两个任务之间
  • 判断两个之间段之间的长度,直接暴力计算即可。(a的年比b大 可能a和b只差一秒,这样年月日时的判断比较困难。)

  • 结构体储存每个时间点,重载小于、大于等于号;把所有的时间点储存在一个数组中,用两个指针从头开始,每次找第一个符合条件的和第一个不符合条件的。判断他们的长度,大于1小时即满足,输出即可。

完整代码

//所有的结果一定出现在所有任务的起始、终止点上 
#include<iostream>
#include<algorithm>
using namespace std;

struct Time//Time类记录每项任务的时间点 
{
	int time[6];//储存年月日时分秒  
	bool operator<(const Time &r) const{
		if(time[0]!=r.time[0]) return time[0]<r.time[0];
		if(time[1]!=r.time[1]) return time[1]<r.time[1];
		if(time[2]!=r.time[2]) return time[2]<r.time[2];
		if(time[3]!=r.time[3]) return time[3]<r.time[3];
		if(time[4]!=r.time[4]) return time[4]<r.time[4];
		if(time[5]!=r.time[5]) return time[5]<r.time[5];
		else return false;} 
		
		bool operator<=(const Time &r) const { return !(r<*this);}

};//重载小于运算 

Time startTime,endTime;
char in[100];
	
Time begin[21][105],end[21][105],t[4010];//begin[i][j]:第i个助教的第j个任务的起始;t:记录所有的时间点,判断用 
int n,m;
int TA_worknum[21];//TA的工作数 
int TA_freenum;//TA空闲的个数,用于判断结果

bool Judge(int a)//检查a点是否符合要求
{
	TA_freenum=0;
	for(int i=0;i<m;i++)//判断所有TA 
	{
	if(TA_worknum[i]==0)//TA[i]空闲
		{TA_freenum++;continue;}
	
		if(t[a] < begin[i][0])   
			{TA_freenum++;continue; }//如果TA[i]的第一个任务时间大于t[a]
		
		if(!(t[a]<end[i][TA_worknum[i]-1])) 
			{TA_freenum++;continue;}//TA[i]最后一个任务时间小于t[a]
		 
		for(int j=0;j<TA_worknum[i];j++)		 //当前时间在TA[i]的两个任务之间 
		 {
		 	if(j+1 < TA_worknum[i])
		 	if((!(t[a]<end[i][j]))  && t[a] < begin[i][j+1]) 
				{TA_freenum++;continue;}
		 }
	}
	
	if(TA_freenum >=2 && TA_freenum >= m-1) return true;   //该点合法
	return false; 

} 

bool judge_len(int l,int r)  //判断l和r两个时间点中间的时间是不是大于等于1h
{
	
		long long time1 =	(long long)(t[r].time[0] - t[l].time[0])*12*30*24*60*60 +
				(long long)(t[r].time[1] - t[l].time[1])*30*24*60*60 +
				(long long)(t[r].time[2] - t[l].time[2])*24*60*60 +
				(long long)(t[r].time[3] - t[l].time[3])*60*60 +
				(long long)(t[r].time[4] - t[l].time[4])*60 +
				(long long)(t[r].time[5] - t[l].time[5]);

//	cout<<time1<<endl;
	if(time1 >= 3600) return 1;
	return 0;
}


void output(int l) //输出一个点
{

	if(t[l].time[1]<10) 
		cout<<"0";//补零 
	cout<<t[l].time[1];
	
	if(t[l].time[2]<10) 
		cout<<"/0"<<t[l].time[2];
		
	else cout<<"/"<<t[l].time[2];
	
	cout<<"/"<<t[l].time[0];
	
	cout<<" ";
	
	if(t[l].time[3]<10) 
		cout<<"0";
	cout<<t[l].time[3];
	
	if(t[l].time[4]<10) 
	cout<<":0"<<t[l].time[4];
	else cout<<":"<<t[l].time[4];
	
	if(t[l].time[5]<10) cout<<":0"<<t[l].time[5];
	else cout<<":"<<t[l].time[5];

}



int main()
{
int T;
cin>>T;
startTime.time[0]=1800;
startTime.time[1]=1;
startTime.time[2]=1;
startTime.time[3]=0;
startTime.time[4]=0;
startTime.time[5]=0;
endTime.time[0]=2200;
endTime.time[1]=1;
endTime.time[2]=1;
endTime.time[3]=0;
endTime.time[4]=0;
endTime.time[5]=0;
for(int ti=0;ti<T;ti++)
{

TA_freenum=0;
int ct=0;//记录t的时间 
cin>>m;
if(ti!=0) cout<<endl; 
	for(int mi=0;mi<m;mi++)//第mi个助教
		{
		cin>>n;
		TA_worknum[mi]=n;
		
		for(int ni=0;ni<n;ni++)//TA[mi]的第ni个任务
		{
		cin>>begin[mi][ni].time[0]>>begin[mi][ni].time[1]>>begin[mi][ni].time[2];
		cin>>begin[mi][ni].time[3]>>begin[mi][ni].time[4]>>begin[mi][ni].time[5];
		cin>>end[mi][ni].time[0]>>end[mi][ni].time[1]>>end[mi][ni].time[2];
		cin>>end[mi][ni].time[3]>>end[mi][ni].time[4]>>end[mi][ni].time[5];
		gets(in);//把名字、干的事没用信息吸收 
		t[ct++]=begin[mi][ni];
		t[ct++]=end[mi][ni];//记录开始、结束信息(各个节点) 
		
		
		} 
		
		}
		t[ct++] = startTime;
		t[ct++] = endTime;
		sort(t,t+ct);

		int cnt=0;//记录结果数目 
		cout<<"Scenario #"<<ti+1<<":"<<endl;
		int left=0,right=0;//找结果的左右端点 
		int f=0;
		while(left<ct && right<ct)
		{
				
				while( left<ct && !Judge(left) ) left++;   //找到该段第一个合法的左端点 
				right = left;//右端点从此处开始 
				
				while( right<ct && Judge(right) ) right++;  //找到该段第一个不合法的右端点 
				
				if(right==ct) right--; 
				
			//	cout<<"r=---"<<right<<endl;
				
				if(judge_len(left,right))    //判断是否符合时间长度的要求,然后输出这一段;
				{

					cout<<"appointment possible from ";
					output(left);
					cout<<" to ";
					output(right);
					cout<<endl;
					cnt++;
				}
				right++;
				left = right;
				
		}
	if(cnt==0) cout<<"no appointment possible"<<endl;
	}
	return 0;





}






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
完整版:https://download.csdn.net/download/qq_27595745/89522468 【课程大纲】 1-1 什么是java 1-2 认识java语言 1-3 java平台的体系结构 1-4 java SE环境安装和配置 2-1 java程序简介 2-2 计算机的程序 2-3 java程序 2-4 java类库组织结构和文档 2-5 java虚拟机简介 2-6 java的垃圾回收器 2-7 java上机练习 3-1 java语言基础入门 3-2 数据的分类 3-3 标识符、关键字和常量 3-4 运算符 3-5 表达式 3-6 顺序结构和选择结构 3-7 循环语句 3-8 跳转语句 3-9 MyEclipse工具介绍 3-10 java基础知识章节练习 4-1 一维数组 4-2 数组应用 4-3 多维数组 4-4 排序算法 4-5 增强for循环 4-6 数组和排序算法章节练习 5-0 抽象和封装 5-1 面向过程的设计思想 5-2 面向对象的设计思想 5-3 抽象 5-4 封装 5-5 属性 5-6 方法的定义 5-7 this关键字 5-8 javaBean 5-9 包 package 5-10 抽象和封装章节练习 6-0 继承和多态 6-1 继承 6-2 object类 6-3 多态 6-4 访问修饰符 6-5 static修饰符 6-6 final修饰符 6-7 abstract修饰符 6-8 接口 6-9 继承和多态 章节练习 7-1 面向对象的分析与设计简介 7-2 对象模型建立 7-3 类之间的关系 7-4 软件的可维护与复用设计原则 7-5 面向对象的设计与分析 章节练习 8-1 内部类与包装器 8-2 对象包装器 8-3 装箱和拆箱 8-4 练习题 9-1 常用类介绍 9-2 StringBuffer和String Builder类 9-3 Rintime类的使用 9-4 日期类简介 9-5 java程序国际化的实现 9-6 Random类和Math类 9-7 枚举 9-8 练习题 10-1 java异常处理 10-2 认识异常 10-3 使用try和catch捕获异常 10-4 使用throw和throws引发异常 10-5 finally关键字 10-6 getMessage和printStackTrace方法 10-7 异常分类 10-8 自定义异常类 10-9 练习题 11-1 Java集合框架和泛型机制 11-2 Collection接口 11-3 Set接口实现类 11-4 List接口实现类 11-5 Map接口 11-6 Collections类 11-7 泛型概述 11-8 练习题 12-1 多线程 12-2 线程的生命周期 12-3 线程的调度和优先级 12-4 线程的同步 12-5 集合类的同步问题 12-6 用Timer类调度任务 12-7 练习题 13-1 Java IO 13-2 Java IO原理 13-3 流类的结构 13-4 文件流 13-5 缓冲流 13-6 转换流 13-7 数据流 13-8 打印流 13-9 对象流 13-10 随机存取文件流 13-11 zip文件流 13-12 练习题 14-1 图形用户界面设计 14-2 事件处理机制 14-3 AWT常用组件 14-4 swing简介 14-5 可视化开发swing组件 14-6 声音的播放和处理 14-7 2D图形的绘制 14-8 练习题 15-1 反射 15-2 使用Java反射机制 15-3 反射与动态代理 15-4 练习题 16-1 Java标注 16-2 JDK内置的基本标注类型 16-3 自定义标注类型 16-4 对标注进行标注 16-5 利用反射获取标注信息 16-6 练习题 17-1 顶目实战1-单机版五子棋游戏 17-2 总体设计 17-3 代码实现 17-4 程序的运行与发布 17-5 手动生成可执行JAR文件 17-6 练习题 18-1 Java数据库编程 18-2 JDBC类和接口 18-3 JDBC操作SQL 18-4 JDBC基本示例 18-5 JDBC应用示例 18-6 练习题 19-1 。。。
完整版:https://download.csdn.net/download/qq_27595745/89522468 【课程大纲】 1-1 什么是java 1-2 认识java语言 1-3 java平台的体系结构 1-4 java SE环境安装和配置 2-1 java程序简介 2-2 计算机的程序 2-3 java程序 2-4 java类库组织结构和文档 2-5 java虚拟机简介 2-6 java的垃圾回收器 2-7 java上机练习 3-1 java语言基础入门 3-2 数据的分类 3-3 标识符、关键字和常量 3-4 运算符 3-5 表达式 3-6 顺序结构和选择结构 3-7 循环语句 3-8 跳转语句 3-9 MyEclipse工具介绍 3-10 java基础知识章节练习 4-1 一维数组 4-2 数组应用 4-3 多维数组 4-4 排序算法 4-5 增强for循环 4-6 数组和排序算法章节练习 5-0 抽象和封装 5-1 面向过程的设计思想 5-2 面向对象的设计思想 5-3 抽象 5-4 封装 5-5 属性 5-6 方法的定义 5-7 this关键字 5-8 javaBean 5-9 包 package 5-10 抽象和封装章节练习 6-0 继承和多态 6-1 继承 6-2 object类 6-3 多态 6-4 访问修饰符 6-5 static修饰符 6-6 final修饰符 6-7 abstract修饰符 6-8 接口 6-9 继承和多态 章节练习 7-1 面向对象的分析与设计简介 7-2 对象模型建立 7-3 类之间的关系 7-4 软件的可维护与复用设计原则 7-5 面向对象的设计与分析 章节练习 8-1 内部类与包装器 8-2 对象包装器 8-3 装箱和拆箱 8-4 练习题 9-1 常用类介绍 9-2 StringBuffer和String Builder类 9-3 Rintime类的使用 9-4 日期类简介 9-5 java程序国际化的实现 9-6 Random类和Math类 9-7 枚举 9-8 练习题 10-1 java异常处理 10-2 认识异常 10-3 使用try和catch捕获异常 10-4 使用throw和throws引发异常 10-5 finally关键字 10-6 getMessage和printStackTrace方法 10-7 异常分类 10-8 自定义异常类 10-9 练习题 11-1 Java集合框架和泛型机制 11-2 Collection接口 11-3 Set接口实现类 11-4 List接口实现类 11-5 Map接口 11-6 Collections类 11-7 泛型概述 11-8 练习题 12-1 多线程 12-2 线程的生命周期 12-3 线程的调度和优先级 12-4 线程的同步 12-5 集合类的同步问题 12-6 用Timer类调度任务 12-7 练习题 13-1 Java IO 13-2 Java IO原理 13-3 流类的结构 13-4 文件流 13-5 缓冲流 13-6 转换流 13-7 数据流 13-8 打印流 13-9 对象流 13-10 随机存取文件流 13-11 zip文件流 13-12 练习题 14-1 图形用户界面设计 14-2 事件处理机制 14-3 AWT常用组件 14-4 swing简介 14-5 可视化开发swing组件 14-6 声音的播放和处理 14-7 2D图形的绘制 14-8 练习题 15-1 反射 15-2 使用Java反射机制 15-3 反射与动态代理 15-4 练习题 16-1 Java标注 16-2 JDK内置的基本标注类型 16-3 自定义标注类型 16-4 对标注进行标注 16-5 利用反射获取标注信息 16-6 练习题 17-1 顶目实战1-单机版五子棋游戏 17-2 总体设计 17-3 代码实现 17-4 程序的运行与发布 17-5 手动生成可执行JAR文件 17-6 练习题 18-1 Java数据库编程 18-2 JDBC类和接口 18-3 JDBC操作SQL 18-4 JDBC基本示例 18-5 JDBC应用示例 18-6 练习题 19-1 。。。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值