目录
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;
}