蓝桥杯算法训练合集十五 1.打翻的闹钟2.智斗锅鸡3.文件列表

目录

1.打翻的闹钟

2.智斗锅鸡

3.文件列表


1.打翻的闹钟

问题描述

冯迭伊曼晚上刷吉米多维奇刷的太勤奋了,几乎天天迟到。崔神为了让VonDieEman改掉迟到的坏毛病,给他买了个闹钟。
一天早上,老冯被闹钟吵醒,他随手将闹钟按掉丢到一边。不过他突然想起今天还要虐微积分,于是瞅了一眼闹钟:
这个闹钟上只有时针和分针。上面还没数字(崔神:……),只有12个刻度,每30°一个刻度。时针如果恰好指向某个刻度i,则说明这时恰好是i点整(或i+12点整)。因此只有在00:00或12:00时,时针和分针才会指向同一个刻度:刻度0。
但是老冯的闹钟被打翻了,他分不出哪根刻度是刻度0,因此他也不知道现在是几点。于是他随便指定了一根刻度当刻度0,读了一下时间,结果(你懂的)……但是他可以通过测量,得到时针、分针与他指定刻度之间的角度大小(顺时针)。

老冯随便把一根刻度当做刻度0,然后他量得时针的角度为70°,分针的角度为300°,然后他读了一下时间。2:50??这比例不对啊。最后老冯终于将闹钟翻回了正确的位置:原来是8:20。哈哈,老冯你不用挣扎了,又迟到了。
老冯想知道,如果知道某刻度当刻度0后时针、分针的角度,能否算出正确的时间?如果能,或存在多解,那么当前时间最早是什么时候?

输入格式

第一行一个整数T,表示数据组数。
接下来T行,每行两个整数H、M,分别表示老冯量出的时针、分针的角度。

输出格式

输出T行,每行一个字符串。
如果存在解,输出HH:MM,表示最早的时间(比如09:11表示9点11分);否则输出“orz VonDieEman”(不含引号)。

样例输入

5
70 300
90 120
240 36
19 19
10 12

样例输出

08:20
11:00
orz VonDieEman
orz VonDieEman
orz VonDieEman

样例解释

果断不解释。

数据规模

70%的数据,T≤5,不存在无解情况。
100%的数据,T≤100,0≤H,M<360。

示例代码

#include<iostream>
using namespace std;

int main() {
	int T,hour,minute;
	cin >> T;
	for (int i = 0; i < T; i++) {
		cin >> hour >> minute;
		int temp1 = hour % 30;
		temp1 = temp1 * 2;//分
		int temp2 = temp1 * 6;//分钟所占的度数
		//找零刻度线
		int temp3;
		if (minute > temp2) {//在左边
			temp3 = (minute - temp2) % 360;
		}
		else {
			temp3 = minute - temp2+360;
		}
		if (temp3 % 30 != 0) {//如果刻度线不在针上
			cout << "orz VonDieEman" << endl;
			continue;
		}
		int temp4;
		if (temp3 > hour) {
			temp4 = 360 - (temp3 - hour);
		}
		else {
			temp4 = hour - temp3;
		}
		temp4 = temp4 / 30;
		if (temp4 < 10) {
			cout << '0';
		}
		cout << temp4 << ':';
		if (temp1 < 10) {
			cout << '0';
		}
		cout << temp1 << endl;
	}
	return 0;
}

2.智斗锅鸡

问题描述

郭鸡是数学系里一个智商很低却十分好胜的同学。
自从他在“a+b problem”这道题里AC以后,他便觉得自己比贵系同学们厉害了。
于是他找到了你,发起了挑战,挑战内容就是一个叫取石子的游戏。
这个游戏里,首先会有两堆石子,分别有a和b粒石子。
两个人轮流操作,每次操作必须从其中一堆里取出一定粒数的石子(不能不取,可以取完)。
在有限次操作后,会有一个人把最后的石子取走(最后一次当然不一定是只取一粒),那个人就是胜利者。
由于郭鸡是自大的,于是他希望由你选择先取或后取。
作为一名优秀的酒井人,你要在这个游戏里彻底打败郭鸡,使游戏开始以后郭鸡没有任何机会获得胜利。

输入格式

输入共n+2行,第一行是一个整数n,表示郭鸡取石子次数。
第二行是两个正整数a和b,意义见题目描述。
下面n行,每行有两个整数,用空格隔开,表示郭鸡每次操作的堆号(1或2)及他取的石子数。
(注意:在游戏过程中,事实上你是不知道郭鸡接下来会怎么取的,所以我们要求你每一步操作都要保证郭鸡失败)
输入保证你能在他取完n次后的操作中获胜。

输出格式

输出有两种可能。
若你选择先取,则输出n+2行,第一行输出"Fisrt"表示先取,之后n+1行每一行是你每次操作的堆号(1或2)及取出的石子数。
若你选择后取,则输出n+1行,第一行输出"Second"表示后取,之后n行每一行是你每次操作的堆号(1或2)及取出的石子数。
"First"与"Second"的输出均不带引号。

样例输入

4
10 10
1 4
2 3
1 2
2 1

样例输出

Second
2 4
1 3
2 2
1 1

样例输入

1
1 2
1 1

样例输出

First
2 1
2 1

数据规模和约定

0<a,b<1000

示例代码

#include<iostream>
using namespace std;

int main() {
	int n, a, b;
	cin >> n;
	cin >> a >> b;
	if (a != b) {//先手,使得a和b相等
		cout << "First" << endl;
		if (a > b) {
			cout << 1 <<" "<< a - b << endl;
		}
		else {
			cout << 2 << " " << b - a << endl;
		}
	}
	else {
		cout << "Second" << endl;
	}
	int dui, shu;
	for (int i = 0; i < n; i++) {//他干什么,你就和他反着来
		cin >> dui >> shu;
		if (dui == 2) {
			cout << 1 << " " << shu << endl;
		}
		else {
			cout << 2 << " " << shu << endl;
		}
	}
	return 0;
}

3.文件列表

感谢大佬 https://blog.csdn.net/ymzqwq/article/details/97781340

问题描述

BSOI在线评测机被不明身份的人入侵了!!系统中大量的数据遭到恶意破坏,数据文件残缺不全。现在,老师正在尽力抢救数据文件。为了检查数据文件是否完整,老师打印出了所有文件的列表,但数据文件太多,老师眼睛都要看花了。所以,为了方便老师检查,需要你写个程序处理一下文件列表,转换成下面这样统一的格式:(//后面为注释)
data //data文件夹,根目录
|----prob //data下面的文件夹
|  |----a.in //prob下面的文件
|  |----a.out
|----qq //data下面的文件夹
|  |----new //qq下面的文件夹
|  |  |----ok.txt //new下面的文件
|  |----old //空文件夹
|----xxx.rmvb
生成的列表格式有如下要求:
1.属于同一层的文件或文件夹位于相同的缩进处,相邻两层文件间差距5个字符;
2.每个文件夹或文件前有4个’-’(根目录除外),文件夹下方属于文件夹的部分有’|’;
3.属于统一文件夹下的文件或子文件夹按字典序排列;

输入格式

第一行一个整数n( n<=50 ),表示总共的文件数目;
接下来n行,每行描述一个文件的路径,路径以 '/' 作为文件分隔符;
所有文件( 及文件夹 )名均由小写字母和英文点组成;所有输入的根目录都是一样的,文件名长度不超过 10 个字符 ,
每个文件夹下不超过15个文件,不超过 5 层。

输出格式

输出符合要求的文件列表 

样例输入

6
mydoc/abcd/abc.txt
mydoc/dd/libexec.a
mydoc/stdio.h
mydoc/abcde
mydoc/abcd/zzz/game.cpp
mydoc/abcd/new

样例输出

mydoc
|----abcd
|     |----abc.txt
|     |----new
|     |----zzz
|     |     |----game.cpp
|----dd
|     |----libexec.a
|----stdio.h

数据规模和约定

对于30%的数据,根目录下只有文件,没有文件夹 

 示例代码

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
const int N = 100002;
int n;
string s;
vector<string> c[N];
string str[N];

int main() {
	cin >> n;
	for (int i = 1; i <= n; i++) {
		cin >> str[i];
	}
	sort(str + 1, str + 1 + n);//对字符串进行排序
	for(int i = 1; i <= n;i++) {
		string s = str[i].substr(0, str[i].size());//将该字符串赋值给s
		c[i].resize(0);//将容器初始化为0
		int pre = 0;//字符索引
		for(int j=0;j<s.size();j++)
			if (s[j] == '/') {
				string ss = s.substr(pre, j - pre);//将/前的字符装入ss中
				c[i].push_back(ss);
				pre = j + 1;
			}
		c[i].push_back(s.substr(pre, s.size() - pre)); //按'/'分割,最后一个文件存入c[i]
		int flag = 0;
		for (int j = 0; j < c[i].size(); j++) {
			if (flag || j >= c[i - 1].size() || c[i][j] != c[i - 1][j]) { //之前没输出过
				for (int k = 0; k < j - 1; k++) {//j-1个
					cout<<"|    ";
				}
				if (j) {//存在即输出,只要不是根目录
					cout << "|----";
				}
				cout << c[i][j] << endl;
				flag = 1; //flag表示c[i][j]和c[i-1][j]是在同一个文件夹里
			}
		}
	}
	return 0;
}

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值