Educational Codeforces Round 87 (Rated for Div. 2)----题目+题解(A、B)

A. Alarm Clock

time limit per test2 seconds
memory limit per test256 megabytes
inputstandard input
outputstandard output
Polycarp has spent the entire day preparing problems for you. Now he has to sleep for at least a minutes to feel refreshed.

Polycarp can only wake up by hearing the sound of his alarm. So he has just fallen asleep and his first alarm goes off in b minutes.

Every time Polycarp wakes up, he decides if he wants to sleep for some more time or not. If he’s slept for less than a minutes in total, then he sets his alarm to go off in c minutes after it is reset and spends d minutes to fall asleep again. Otherwise, he gets out of his bed and proceeds with the day.

If the alarm goes off while Polycarp is falling asleep, then he resets his alarm to go off in another c minutes and tries to fall asleep for d minutes again.

You just want to find out when will Polycarp get out of his bed or report that it will never happen.

Please check out the notes for some explanations of the example.

Input
The first line contains one integer t (1≤t≤1000) — the number of testcases.

The only line of each testcase contains four integers a,b,c,d (1≤a,b,c,d≤109) — the time Polycarp has to sleep for to feel refreshed, the time before the first alarm goes off, the time before every succeeding alarm goes off and the time Polycarp spends to fall asleep.

Output
For each test case print one integer. If Polycarp never gets out of his bed then print -1. Otherwise, print the time it takes for Polycarp to get out of his bed.

Example
inputCopy
7
10 3 6 4
11 3 6 4
5 9 4 10
6 5 2 3
1 1 1 1
3947465 47342 338129 123123
234123843 13 361451236 361451000
outputCopy
27
27
9
-1
1
6471793
358578060125049
Note
In the first testcase Polycarp wakes up after 3 minutes. He only rested for 3 minutes out of 10 minutes he needed. So after that he sets his alarm to go off in 6 minutes and spends 4 minutes falling asleep. Thus, he rests for 2 more minutes, totaling in 3+2=5 minutes of sleep. Then he repeats the procedure three more times and ends up with 11 minutes of sleep. Finally, he gets out of his bed. He spent 3 minutes before the first alarm and then reset his alarm four times. The answer is 3+4⋅6=27.

The second example is almost like the first one but Polycarp needs 11 minutes of sleep instead of 10. However, that changes nothing because he gets 11 minutes with these alarm parameters anyway.

In the third testcase Polycarp wakes up rested enough after the first alarm. Thus, the answer is b=9.

In the fourth testcase Polycarp wakes up after 5 minutes. Unfortunately, he keeps resetting his alarm infinitely being unable to rest for even a single minute 😦

题意:
Polycarp每天需要睡a分钟的觉,在闹钟响之前睡了b分钟,如果他睡够了就直接起床,没睡够的话他就调闹钟在c分钟之后再响一次,但是每次入睡他都需要d分钟

思路:
题目比较基础,读懂题目就能做出来,不多说了直接贴代码,看代码就OK

代码:

#include<cstdio>
#include<iostream>
#include<cmath>
using namespace std;
typedef long long ll;
int main()
{
	int t;
	cin >> t;
	ll a, b, c, d;
	while (t--)
	{
		cin >> a >> b >> c >> d;
		if (b >= a)//睡够了,直接起床
		{
			cout << b << endl;
			continue;
		}
		else
		{
			if (d >= c)//还没睡着闹钟就响了,陷入死循环,永远也睡不醒
			{
				cout << "-1" << endl;
				continue;
			}
			int m = a - b, n = c - d;
			int k = ceil(m*1.0 / n);//向上取整,闹钟响k次
			cout << b + c * k << endl;
		}
	}
	return 0;
}

B. Ternary String

time limit per test2 seconds
memory limit per test256 megabytes
inputstandard input
outputstandard output
You are given a string s such that each its character is either 1, 2, or 3. You have to choose the shortest contiguous substring of s such that it contains each of these three characters at least once.

A contiguous substring of string s is a string that can be obtained from s by removing some (possibly zero) characters from the beginning of s and some (possibly zero) characters from the end of s.

Input
The first line contains one integer t (1≤t≤20000) — the number of test cases.

Each test case consists of one line containing the string s (1≤|s|≤200000). It is guaranteed that each character of s is either 1, 2, or 3.

The sum of lengths of all strings in all test cases does not exceed 200000.

Output
For each test case, print one integer — the length of the shortest contiguous substring of s containing all three types of characters at least once. If there is no such substring, print 0 instead.

Example
inputCopy
7
123
12222133333332
112233
332211
12121212
333333
31121
outputCopy
3
3
4
4
0
0
4
Note
Consider the example test:

In the first test case, the substring 123 can be used.

In the second test case, the substring 213 can be used.

In the third test case, the substring 1223 can be used.

In the fourth test case, the substring 3221 can be used.

In the fifth test case, there is no character 3 in s.

In the sixth test case, there is no character 1 in s.

In the seventh test case, the substring 3112 can be used.

题意:
给你一个由 1 2 3 组成的字符串s,让你求s中包含 1 2 3 的最短连续字符串

思路:

思路:暴力的话枚举每一个字母,找到满足条件的最短的子串。O(n^2)

O(n^2)的区间问题常用优化有尺取法[双指针].O(n)

有i,j,两个快慢指针,i先走,当走到的位置发现已经有满足有1,2,3,那么这时候再让j往前走,更新长度,当[j,i]这段区间不满足了,那么i再走。
具体见代码

代码:

#include <iostream>
#include <algorithm>
#include <cstring>
#include <cmath>
const int MAXN = 2e5 + 10;
const int inf = 0x3f3f3f3f;
using namespace std;
int n, m, K;
char str[MAXN];
int main() 
{
	int t;
	scanf("%d ", &t);
	while (t--) 
	{
		scanf("%s ", str);
		int cnt[128] = { 0 };
		int lef = 0, rig = -1, ans = inf;
		while (str[lef]) 
		{
			while (str[rig + 1] && !(cnt[(int)'1'] && cnt[(int)'2'] && cnt[(int)'3']))
			{
				cnt[(int)str[rig + 1]] ++;
				rig++;
			}
			if ((cnt[(int)'1'] && cnt[(int)'2'] && cnt[(int)'3']))
				ans = min(ans, rig - lef + 1);
			cnt[(int)str[lef]] --;
			lef++;
		}
		printf("%d\n", ans == inf? 0 : ans);
	}
	return 0;
}

本人水平有限,若有不足,请指正

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值