B远足活动
题目描述
小明决定徒步完成一个N天的远足登山活动。第一天他带上一个大睡袋和足够的食物,从大本营出发。大本营的海拔高度为0,在第N天,他必须回到大本营。在这N天中,他可以在他的大睡袋和简易的帐篷中入睡。
在每天的登山活动中,他可以选择向山顶出发,也可以选择下山(同一天只能选择一种方式),而且有如下两条规则:
1、在登山过程中,他不能走的太快,海拔的升高的过程,空气的含氧量会发生变化,因此每天只能上升A米的海拔。
2、在下山过程中,他也不能走的太快,否则他的膝盖无法承受冲击。每天他只能下降B米的海拔。
例如:某天早晨小明处在470米的海拔位置,A=100且B=200,那么他在这天中可以向上到达570米的位置,也可以下山达到海拔270米的位置,因此一天结束后,他可能处在的海拔位置在270~570米之间。
现在,给定N,A和B,问小明最多能到达海拔多少米的高度。
输入
第一行三个整数,N,A和B,表示N天的登山远足活动,每天可以向上爬海拔A米,也可以下山下降海拔B米。
输出
输出一个整数,表示在第N天中能到达的最高海拔高度。
样例输入 Copy
【样例1】 3 7 10 【样例2】 5 40 30
样例输出 Copy
【样例1】 10 【样 80
提示
样例1解释:第一天向上爬7,第二天向上爬3到达海拔10,第三天回到大本营。
样例2解释:第一天和第二天分别向上爬40,后面3天下山分别30+30+20
对于50%的数据,2<=n<=20,1<=A,B<=50
对于100%的数据,2<=n<=50,1<=A,B<=50
做这个题的原则:一步一步走, 能上就上。
代码段:
#include <iostream>
using namespace std;
int main() {
int n, a, b, i, sum = 0;
cin >> n >> a >> b;
for (i = 1; i <= n; i++) {
if (a * i >= b * (n - i) && a * i - b * (n - i) <= a) {
sum = b * (n - i);
}
if (a * i <= b * (n - i) && b * (n - i) - a * i <= b) {
sum = a * i;
}
}
cout << sum;
}
核心的判断部分:
if (a * i >= b * (n - i) && a * i - b * (n - i) <= a) {
sum = b * (n - i);
}
if (a * i <= b * (n - i) && b * (n - i) - a * i <= b) {
sum = a * i;
}
问题C:
这个题目比较离谱(主要是我把能踩的都踩了)
注意的事情是, 尽量少用cin 或者说直接 ios::sync_with_stdio(false)关掉同步, 再就是不要一边边地用strlen, 这破玩意容易超时啊。 这边直接建议 s.length(), 或者是定义一个k, 用来储存长度。
给出两个代码哈, 一个是cstring , 另一个是string
#include <cstring>
#include <iostream>
using namespace std;
int main() {
int i, j;
char op[1000010];
scanf("%s", op);
int k = strlen(op);
int max = 1, cnt = 1;
for (i = 1; i < k; i++) {
if (op[i] == op[i - 1]) cnt = 1;
else cnt++;
if (cnt > max) max = cnt;
}
printf("%d", max);
}
另外一种
#include<iostream>
#include<string>
using namespace std;
int main()
{
char c;
string s;
cin >> s;
int curLength = 1;
int maxLength = 1;
for (int i = 1; i < s.length(); i++)
{
if (s[i] == s[i - 1])
{
curLength = 1;
}
else
{
curLength++;
}
if (curLength > maxLength)
{
maxLength = curLength;
}
}
cout << maxLength << endl;
cin >> c;
}
问题J:
问题 J: 贪睡虫
时间限制: 1.000 Sec 内存限制: 128 MB
提交 状态
题目描述
你是个贪睡虫,有一天被老师逮个正着,这个老师很有意思,提出一个问题:“给定入睡时刻和起床时刻,计算一共睡了多长时间”,如果回答正确就可以免于处罚。入睡时刻和起床时刻都采用24小时制表示法(见备注),而且知道睡觉时间最少为1秒,最多为24小时。
输入
输入第一行描述入睡时刻,第二行描述起床时刻,两个时刻都是采用“HH:MM:SS”,其中“HH”表示时,范围为0到23,“MM”表示分,范围为0到59,“SS”描述秒,范围为0到59。注意即使时分秒只有一位数也要通过加0补齐两位。
输出
输出一共睡了多长时间。格式同输入一样。
样例输入 Copy
20:00:00 04:00:00
样例输出 Copy
08:00:00
提示
24小时制,是一种时间的表示方法。以区别于12小时制。
在24小时制中,下午1点被写成13点,下午2点被写作14点。
尽管,在生活中,我们使用更多的是12小时制。比如我们说,下午5点下班。我们说的,“朝9晚5”是指的是,上午9点和下午5点(普通职员上下班的时间)。但在科学严谨的说明中,在合同等法律文书中,时间要写成24小时制。
输入可以优化: scanf("%d:%d:%d", &a, &b, &c)减少字符串的处理。
#include <iostream>
using namespace std;
char op[10], bp[10];
int main() {
scanf("%s", op);
scanf("%s", bp);
int a, b, c, d, e, f;
a = (op[0] - '0') * 10 + op[1] - '0';
d = (bp[0] - '0') * 10 + bp[1] - '0';
b = (op[3] - '0') * 10 + op[4] - '0';
e = (bp[3] - '0') * 10 + bp[4] - '0';
c = (op[6] - '0') * 10 + op[7] - '0';
f = (bp[6] - '0') * 10 + bp[7] - '0';
//cout << a << ' ' << b << ' ' << c << endl;
//cout << d << ' ' << e <<' ' << f << endl;
if (f < c) {
e--;
f += 60;
}
if (e < b) {
d--;
e += 60;
}
if (d < a) {
d += 24;
}
if (d - a == 0 && e - b == 0 && f - c == 0) printf("24:00:00");
else printf("%02d:%02d:%02d", d - a, e - b, f - c);
//cout << d - a << ':' << e - b << ':' << f - c;
return 0;
}
问题 K: 羊羊整除
时间限制: 1.000 Sec 内存限制: 128 MB
提交 状态
题目描述
羊年到了,村长开始教小羊学习Pascal语言,刚开始学习四则运算。村长在白板上写下两个整数16和3,问小羊们,有16只羊,平均分到3个羊村,每个羊村分到的数量必须相同,这个分配的数量最大是多少?小羊们很快就得到了答案,每个羊村分到5只,有1只羊就只能落单了。村长在白板上写下5。没错,这个就是Div(整除)的用法!
为了检验小羊们是否掌握了整除运算,村长要求小羊们轮流从白板上任意选取两个不同的数,由大数整除小数,若所得结果没有出现在白板上,就将该值写在白板上。直到小羊们再也找不到没出现过的整数。
虽然这样上课很锻炼小羊们的运算能力,但是课堂时间有限。为了控制课堂时间,村长想要知道,根据当前白板上的数字,最终白板上会出现几个数字?现在请你帮他编写一个程序快速计算一下吧!
输入
第一行一个整数N,表示当前白板上出现的整数个数。
第二行N个整数,中间用空格分隔,表示当前在白板上的数字,保证每个数字都不相同。
输出
输出一个整数,表示最终白板上数字的个数。
样例输入 Copy
【样例1】 2 16 3 【样例2】 3 17 2 1
样例输出 Copy
【样例1】 4 【样例2】 5
提示
【样例1解释】
选择16和3,写下5;选择5和3,写下1;共16,3,5,1,四个整数。
【样例2解释】
选择17和2,写下8;再选择8和2,写下4;共17,2,8,4,1,五个整数。
【数据范围】
50%的数据,N<=50;
100%的数据,N<=100,1<=ai<=100。
这个题根据数据的范围进行处理。 主要是数据比较大, 老老实实套循环啊哈
#include <bits/stdc++.h>
using namespace std;
int main() {
int n, i, j, maxm = 0;
int a[110];
memset(a, 0, sizeof(a));
cin >> n;
for (i = 1; i <= n; i++) {
scanf("%d", &j);
a[j] = 1;
maxm = max(maxm, j);
}
for (i = maxm; i >= 1; i--) {
if (a[i] == 1) {
for (j = i; j >= 1; j--) {
if (a[j] == 1) {
a[i / j] = 1;
}
}
}
}
//cout << maxm << endl;
int cnt = 0;
for (i = 1; i <= maxm; i++) {
if (a[i] == 1) {
cnt++;
//cout << i << endl;
}
}
cout << cnt;
return 0;
}
核心代码就是这一段:
for (i = maxm; i >= 1; i--) {
if (a[i] == 1) {
for (j = i; j >= 1; j--) {
if (a[j] == 1) {
a[i / j] = 1;
}
}
}
}
咱就感觉离谱(反正自己还是一如既往的菜, run了run了