目录
试题A:求和
试题B:矩形切割
试题C:年号字串
试题D:质数
试题E:最大降雨量
试题F:旋转
试题G:外卖店优先级
试题H:人物相关性分析(没有AC)
试题 I:等差数列
试题J:扫地机器人(不会)
本题总分:5分
【问题描述】
小明对数位中含有 2、0、1、9 的数字很感兴趣,在 1 到 40 中这样的数包 括 1、2、9、10 至 32、39 和 40,共 28 个,他们的和是 574。
请问,在 1 到 2019 中,所有这样的数的和是多少?
① to_string()函数:
其他类型数据转string,C++11新特性,很方便,比赛的时候大题不要用(蓝桥不能使用C++11特性),
填空要用的话看以这个回答:Dev 使用C++11特性,
大题的话,int转string可以用sprintf(),stringstream代替:C/C++ int 和 string 相互转换。
② find_first_of(string str,int index = 0)函数:
查找在字符串中第一个与str中的某个字符匹配的字符,返回它的位置。搜索从index开始,如果没找到就返回string::npos
#include
using namespace std;
int main()
{
int m = 2019, sum = 0;
string s;
m++;
while (m-- > 1)
{
s = to_string(m);
if (s.find_first_of("2019") != string::npos)
{
sum += m;
}
}
cout << sum << endl;
//system("pause");
return 0;
}
/*
答案:1905111
*/
本题总分:5 分
【问题描述】
小明有一些矩形的材料,他要从这些矩形材料中切割出一些正方形。
当他面对一块矩形材料时,他总是从中间切割一刀,切出一块最大的正方 形,剩下一块矩形,然后再切割剩下的矩形材料,直到全部切为正方形为止。例如,对于一块两边分别为 5 和 3 的材料(记为 5×3),小明会依次切出 3×3、2×2、1×1、1×1 共 4 个正方形。
现在小明有一块矩形的材料,两边长分别是 2019 和 324。请问小明最终会 切出多少个正方形?
#include
using namespace std;
int work(int a, int b)
{
if (a == b)
return 1;
int k = min(a, b);
int l = max(a, b);
return work(k, l - k) + 1;
}
int main()
{
int a = 2019, b = 324;
cout << work(a, b) << endl;
//system("pause");
return 0;
}
/*
答案:21
*/
本题总分:5 分
【问题描述】
小明用字母 A 对应数字 1,B 对应 2,以此类推,用 Z 对应 26。对于 27 以上的数字,小明用两位或更长位的字符串来对应,例如 AA 对应 27,AB 对 应 28,AZ 对应 52,LQ 对应 329。
请问 2019 对应的字符串是什么?
#include
using namespace std;
int main()
{
int m = 2019;
while( m!=0)
{
int t = m%26;
m=m/26;
cout << char(t+64);
}
//system("pause");
return 0;
}
/*
输出:QYB
答案:BYQ
*/
本题总分:10 分
【问题描述】
我们知道第一个质数是 2、第二个质数是 3、第三个质数是 5……请你计算 第 2019 个质数是多少?
#include
using namespace std;
int prim(int a)
{
for (int i = 2; i <= sqrt(a); i++)
{
if (a % i == 0)
return false;
}
return true;
}
int main()
{
int cnt = 0;
for (int i = 1; i; i++)
{
if (prim(i) == true)
cnt++;
if (cnt == 2020)
{
cout << i << endl;
break;
}
}
//system("pause");
return 0;
}
/*
答案:17569
*/
本题总分:10 分
【问题描述】
由于沙之国长年干旱,法师小明准备施展自己的一个神秘法术来求雨。
这个法术需要用到他手中的 49 张法术符,上面分别写着 1 至 49 这 49 个数字。法术一共持续 7 周,每天小明都要使用一张法术符,法术符不能重复使用。
每周,小明施展法术产生的能量为这周 7 张法术符上数字的中位数。法术施展完 7 周后,求雨将获得成功,降雨量为 7 周能量的中位数。
由于干旱太久,小明希望这次求雨的降雨量尽可能大,请大最大值是多少?
上图借鉴于博客:https://blog.csdn.net/u013377068/article/details/88776898 博主:糖宋元明清
例如这样,就是一种可能的答案:
答案:34
时间限制: 1.0s 内存限制: 256.0MB 本题总分:15 分
【问题描述】
图片旋转是对图片最简单的处理方式之一,在本题中,你需要对图片顺时针旋转 90 度。
我们用一个 n × m 的二维数组来表示一个图片,例如下面给出一个 3 × 4 的图片的例子:
1 3 5 7
9 8 7 6
3 5 9 7
这个图片顺时针旋转 90 度后的图片如下:
3 9 1
5 8 3
9 7 5
7 6 7
给定初始图片,请计算旋转后的图片。【输入格式】
输入的第一行包含两个整数 n 和 m,分别表示行数和列数。
接下来 n 行,每行 m 个整数,表示给定的图片。图片中的每个元素(像素)为一个值为 0 至 255 之间的整数(包含 0 和 255)。【输出格式】
输出 m 行 n 列,表示旋转后的图片。【样例输入】
3 4 1 3 5 7 9 8 7 6 3 5 9 7
【样例输出】
3 9 1 5 8 3 9 7 5 7 6 7
【评测用例规模与约定】
对于 30% 的评测用例,1 ≤ n, m ≤ 10。
对于 60% 的评测用例,1 ≤ n, m ≤ 30。
对于所有评测用例,1 ≤ n, m ≤ 100。
#include
using namespace std;
int main()
{
int n, m;
cin >> n >> m;
int map[200][200];
for (int i = 0; i < n; i++)
for (int j = 0, t; j < m; j++)
cin >> map[i][j];
for (int i = 0; i < m; i++)
for (int j = n - 1; j >= 0; j--)
cout << map[j][i] << (j==0?'\n':' ');
//system("pause");
return 0;
}
【题目描述】
“饱了么”外卖系统中维护着 N 家外卖店,编号 1 ∼ N。每家外卖店都有 一个优先级,初始时 (0 时刻) 优先级都为 0。
每经过 1 个时间单位,如果外卖店没有订单,则优先级会减少 1,最低减 到 0;而如果外卖店有订单,则优先级不减反加,每有一单优先级加 2。
如果某家外卖店某时刻优先级大于 5,则会被系统加入优先缓存中;如果 优先级小于等于 3,则会被清除出优先缓存。
给定 T 时刻以内的 M 条订单信息,请你计算 T 时刻时有多少外卖店在优 先缓存中。
【输入】
第一行包含 3 个整数 N、M 和 T。
以下 M 行每行包含两个整数 ts 和 id,表示 ts 时刻编号 id 的外卖店收到一个订单。
【输出】
输出一个整数代表答案。
【样例输入】
2 6 6 1 1 5 2 3 1 6 2 2 1 6 2
【样例输出】
1
【样例解释】
6 时刻时,1 号店优先级降到 3,被移除出优先缓存;2 号店优先级升到 6, 加入优先缓存。所以是有 1 家店 (2 号) 在优先缓存中。
【评测用例规模与约定】
对于 80% 的评测用例,1 ≤ N, M, T ≤ 10000。 对于所有评测用例,1 ≤ N, M, T ≤ 100000,1 ≤ ts ≤ T,1 ≤ id ≤ N。
对每个店进行分析。
#include
using namespace std;
int main()
{
int n, m, t, ts, id, cnt = 0;
int level;
bool is_priority = false;
vector v[100005];
cin >> n >> m >> t;
for (int i = 1; i <= m; i++)
{
cin >> ts >> id;
v[id].push_back(ts);
}
for (int i = 1; i <= n; i++)
{
if (v[i].size() == 0)
continue;
sort(v[i].begin(), v[i].end());
is_priority = false;
level = 2;
for (int j = 1; j < v[i].size(); j++)
{
if (v[i][j] - v[i][j - 1] <= 1)
level += 2;
else
{
level -= (v[i][j] - v[i][j - 1] - 1);
if (level < 0)
level = 0;
if (level <= 3)
is_priority = false;
level += 2;
}
if (level > 5)
{
is_priority = true;
}
}
int k = v[i][v[i].size() - 1];
level -= (t - k);
if (level <= 3)
is_priority = false;
if (is_priority == true)
cnt++;
}
cout << cnt << endl;
//system("pause");
return 0;
}
/*
1 4 7
1 1
2 1
3 1
7 1
*/
时间限制: 1.0s 内存限制: 256.0MB 本题总分:20 分
【问题描述】
小明正在分析一本小说中的人物相关性。他想知道在小说中 Alice 和 Bob 有多少次同时出现。 更准确的说,小明定义 Alice 和 Bob“同时出现”的意思是:在小说文本 中 Alice 和 Bob 之间不超过 K 个字符。
例如以下文本:
This is a story about Alice and Bob.Alice wants to send aprivate message to Bob. 假设 K = 20,则 Alice 和 Bob 同时出现了 2 次,分别是”Alice and Bob” 和”Bob. Alice”。前者 Alice 和 Bob 之间有 5 个字符,后者有 2 个字符。 注意: 1. Alice 和 Bob 是大小写敏感的,alice 或 bob 等并不计算在内。 2. Alice 和 Bob 应为单独的单词,前后可以有标点符号和空格,但是不能 有字母。例如 Bobbi 並不算出现了 Bob。
【输入格式】
第一行包含一个整数 K。 第二行包含一行字符串,只包含大小写字母、标点符号和空格。长度不超 过 1000000。
【输出格式】
输出一个整数,表示 Alice 和 Bob 同时出现的次数。
【样例输入】20 This is a story about Alice and Bob.Alice wants to send aprivate message to Bob.
【样例输出】
2
【评测用例规模与约定】
对于所有评测用例,。
https://www.dotcpp.com/oj/problem2309.html,C语言网上1/243的正确率。。。。
目前全网没找到分享正确答案的博主,我自己也没AC,oj跑36分,,一百万长的串!!怎样才能不超时呀。。。求指点(*╹▽╹*)
#include
#include
时间限制: 1.0s 内存限制: 256.0MB 本题总分:20 分
【题目描述】
数学老师给小明出了一道等差数列求和的题目。但是粗心的小明忘记了一 部分的数列,只记得其中 N 个整数。
现在给出这 N 个整数,小明想知道包含这 N 个整数的最短的等差数列有 几项?
【输入】
输入的第一行包含一个整数 N。 第二行包含N个整数A1,A2,···,AN。(注意A1 ∼AN并不一定是按等差数
列中的顺序给出)
【输出】
输出一个整数表示答案
【样例输入】
5 2 6 4 10 20
【样例输出】
10
【样例说明】
包含 2、6、4、10、20 的最短的等差数列是 2、4、6、8、10、12、14、16、 18、20。
【评测用例规模与约定】
对于所有评测用例,2 ≤ N ≤ 100000,0 ≤ Ai ≤ 。
从小到大排好序,公差d = ,先求出d
然后有三种情况:
一、2 4 6 10 20 ,显然d = 2, 项数 =(20-2)/2+1 = 10;
二、1 3 8,算出来d=2,但这是错的,(8-1)/ 2= 3.5 ,两项之差不能被d整除,不符合等差数列性质,所以d=1;
三、2 2 2 2 2,d=0,直接输出n。
#include
#include
#include
#include
#include
#include
#include
using namespace std;
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int m;
vector v;
cin >> m;
for (int i = 0, t; i < m; i++)
{
cin >> t;
v.push_back(t);
}
sort(v.begin(), v.end());
int d = INT32_MAX;
for (int i = 1; i < v.size(); i++)
{
int t = fabs(v[i] - v[i - 1]);
d = min(d, t);
}
int k = v[m - 1] - v[0];
cout << (k == 0 ? m : (k % d == 0 ? k / d + 1 : k + 1)) << endl;
//system("pause");
return 0;
}
完全没有思路