2016郑州大学ACM/ICPC训练赛 Round4

B题:追踪术

Description

  赏金猎人在追捕他的猎物。已知当前赏金猎人与猎物相距s米,赏金猎人每秒移动a米,猎物每秒移动c米。赏金猎人有一个技能追踪术,使用后,他的移动速度将会变为每秒移动b米(b>a),使用该技能需要持续施法t秒,持续施法期间,赏金猎人不能移动。请问,赏金猎人最快需要多长时间才能追上猎物(与猎物距离为0时视为追上)。

Input

多组数据。

每组5个整数,s,a,b,c,t (1<=s<=1000,1<=a

Output

输出一个数,赏金猎人追上猎物所需最短时间,保留6位小数。若无法追上,输出-1。

Sample Input

10 1 2 1 1
10 1 2 3 1

Sample Output

12.000000
-1
代码如下:

#include 
int main()
{
	int s, a, b, c, t;
	double x, y;
	
	while ( scanf( "%d%d%d%d%d", 
			&s, &a, &b, &c, &t) != EOF){
		if ( b <= c)
		printf( "-1\n");
		else{
			x = 1.0 * ( s + b * t) / ( b - c);
			if ( a <= c)
				printf( "%f\n", x);
			else{
				y = 1.0 * s / ( a - c);
				x = x > y ? y : x;
				printf( "%f\n", x);
			} 
		}
	}
	return 0;
} 

对于每组输入,若b不大于c则必然不可能追上,直接输出-1


而在b大于c时,若a也大于c则应当计算使用技能和不使用技能所用的时间,取其小者。若a不大于c,则只能使用技能才能追上。。。


C题:最长匹配子串

Description


定义一个满足括号匹配的字符串为完美串。一个由'(',')'组成的字符串,怎么才能求出
来字符串S中最长的完美串(S的子串)的长度呢?

Input


输入的第一行是一个数字k,代表输入的样例组数(k < 100)。
每组样例是一个字符串只由'(',')'这两个字符组成的字符串s(|s| < 100000)。

Output


输出s中最长的匹配子串的长度。

Sample Input

3
()()
((())
(

Sample Output

4
4
0
代码如下:

#include 
#include 
char a[100010];
int main()
{
	int t, x, max, i, j, c;
	
	scanf( "%d", &t);
	getchar();
	while ( t--){
		gets( a);
		x = strlen( a);
		max = i = 0;
		while ( i < x){
			if ( a[i] == '('){
				c = 1;
				for ( j = i + 1; j < x; ++j){
					if ( a[j] == '(')
						c++;
					else
						c--;
					if ( c == 0 && j - i + 1 > max)
						max = j - i + 1;
					if ( c < 0){
						i = j;
						break;
					}
				}
			}
			i++;
		}
		printf( "%d\n", max);
	}
	return 0;
}

对于一个完美串,必然以(开始,所以枚举每一个(,然后确定其长度

一个for循环加一个判断语句,判断长度时,当右括号数目多与左括号时此完美串到达终点,易知,起点为i终点为j,以(i , j)这个区间内的其它任何左括号为起点终点都不可能大于j,即i - j + 1即为该区间内的最大完美子串长度。所以下一个起点应是从j往后的第一个左括号。

对于到达总串末尾时c不小于0的情况,此时会将该子串中的每一个起点枚举一遍。

你可能感兴趣的:(2016郑州大学ACM/ICPC训练赛 Round4)