如果题目版权限制,不能发表该题解,请私信,我会立刻删除博客。
题目描述
注意:本题只允许使用C/C++或Java进行解答,其他编程语言提交均视作无效处理。
小W有一个电子时钟用于显示时间,显示的格式为HH:MM:SS,HH,MM,SS分别表示时,分,秒。其中时的范围为[‘00’,‘01’…‘23’],分的范围为[‘00’,‘01’…‘59’],秒的范围为[‘00’,‘01’…‘59’]。
但是有一天小W发现钟表似乎坏了,显示了一个不可能存在的时间“98:23:00”,小W希望改变最少的数字,使得电子时钟显示的时间为一个真实存在的时间,譬如“98:23:00”通过修改第一个’9’为’1’,即可成为一个真实存在的时间“18:23:00”。修改的方法可能有很多,小W想知道,在满足改变最少的数字的前提下,符合条件的字典序最小的时间是多少。其中字典序比较为用“HHMMSS”的6位字符串进行比较。
输入描述:
每个输入数据包含多个测试点。每个测试点后有一个空行。 第一行为测试点的个数T(T<=100)。 每个测试点包含1行,为一个字符串”HH:MM:SS”,表示钟表显示的时间。
输出描述:
对于每个测试点,输出一行。如果钟表显示的时间为真实存在的时间,则不做改动输出该时间,否则输出一个新的”HH:MM:SS”,表示修改最少的数字情况下,字典序最小的真实存在的时间。
示例1
输入
2
19:90:23
23:59:59
输出
19:00:23
23:59:59
【 网易互娱2018校招游戏研发工程师在线笔试 A】【水题】
#include<stdio.h>
#include<iostream>
#include<string.h>
#include<string>
#include<ctype.h>
#include<math.h>
#include<set>
#include<map>
#include<vector>
#include<queue>
#include<bitset>
#include<algorithm>
#include<time.h>
using namespace std;
void fre() { freopen("c://test//input.in", "r", stdin); freopen("c://test//output.out", "w", stdout); }
#define MS(x, y) memset(x, y, sizeof(x))
#define ls o<<1
#define rs o<<1|1
typedef long long LL;
typedef unsigned long long UL;
typedef unsigned int UI;
template <class T1, class T2>inline void gmax(T1 &a, T2 b) { if (b > a)a = b; }
template <class T1, class T2>inline void gmin(T1 &a, T2 b) { if (b < a)a = b; }
const int N = 0, M = 0, Z = 1e9 + 7, inf = 0x3f3f3f3f;
template <class T1, class T2>inline void gadd(T1 &a, T2 b) { a = (a + b) % Z; }
int casenum, casei;
int h, m, s;
char S[10];
int a[10], b[10];
struct ANS
{
int h, m, s;
}ans;
//简单做法
void simple()
{
int h, m, s;
scanf("%d:%d:%d", &h, &m, &s);
if (h >= 24)h %= 10;
if (m >= 60)m %= 10;
if (s >= 60)s %= 10;
printf("%02d:%02d:%02d\n", h, m, s);
}
//复杂暴力做法
void complex()
{
scanf("%s", S);
a[0] = S[0] - 48;
a[1] = S[1] - 48;
a[2] = S[3] - 48;
a[3] = S[4] - 48;
a[4] = S[6] - 48;
a[5] = S[7] - 48;
//60 * 60 * 24
int ansdif = inf;
for (int i = 0; i < 24; ++i)
{
b[0] = i / 10;
b[1] = i % 10;
for (int j = 0; j < 60; ++j)
{
b[2] = j / 10;
b[3] = j % 10;
for (int k = 0; k < 60; ++k)
{
b[4] = k / 10;
b[5] = k % 10;
int dif = 0;
for (int u = 0; u <= 5; ++u)
{
dif += (a[u] != b[u]);
}
if (dif < ansdif)
{
ansdif = dif;
ans = { i,j,k };
}
}
}
}
printf("%02d:%02d:%02d\n", ans.h, ans.m, ans.s);
}
int main()
{
scanf("%d", &casenum);
for (casei = 1; casei <= casenum; ++casei)
{
simple();
}
return 0;
}
/*
【题意】
略
【分析】
可以直接暴力枚举所有时刻取一个最优的。
也可以对时、分、秒 三个数整体判定,如果不合法,把数的十位数变成0即可。
【时间复杂度&&优化】
O(1)
*/
题目描述
注意:本题只允许使用C/C++或Java进行解答,其他编程语言提交均视作无效处理。
字符迷阵是一种经典的智力游戏。玩家需要在给定的矩形的字符迷阵中寻找特定的单词。
在这题的规则中,单词是如下规定的:
1. 在字符迷阵中选取一个字符作为单词的开头;
2. 选取右方、下方、或右下45度方向作为单词的延伸方向;
3. 以开头的字符,以选定的延伸方向,把连续得到的若干字符拼接在一起,则
称为一个单词
。
以图1为例,如果要在其中寻找单词"WORD",则绿色框所标示的都是合法的方案,而红色框所标示的都是不合法的方案。
现在的问题是,给出一个字符迷阵,及一个要寻找的单词,问能在字符迷阵中找到多少个该单词的合法方案。注意合法方案是可以重叠的,如图1所示的字符迷阵,其中单词"WORD"的合法方案有4种。
输入描述:
输入的第一行为一个正整数T,表示测试数据组数。 接下来有T组数据。每组数据的第一行包括两个整数m和n,表示字符迷阵的行数和列数。接下来有m行,每一行为一个长度为n的字符串,按顺序表示每一行之中的字符。再接下来还有一行包括一个字符串,表示要寻找的单词。 数据范围: 对于所有数据,都满足1<=T<=9,且输入的所有位于字符迷阵和单词中的字符都为大写字母。要寻找的单词最短为2个字符,最长为9个字符。字符迷阵和行列数,最小为1,最多为99。 对于其中50%的数据文件,字符迷阵的行列数更限制为最多为20。