B題:追蹤術
Description
賞金獵人在追捕他的獵物。已知當前賞金獵人與獵物相距s米,賞金獵人每秒移動a米,獵物每秒移動c米。賞金獵人有一個技能追蹤術,使用後,他的移動速度將會變爲每秒移動b米(b>a),使用該技能需要持續施法t秒,持續施法期間,賞金獵人不能移動。請問,賞金獵人最快需要多長時間才能追上獵物(與獵物距離爲0時視爲追上)。
Input
多組數據。
每組5個整數,s,a,b,c,t (1<=s<=1000,1<=a<b<=100,1<=c<=100,1<=t<=10)。含義見題目。
Output
輸出一個數,賞金獵人追上獵物所需最短時間,保留6位小數。若無法追上,輸出-1。
Sample Input
10 1 2 1 1
10 1 2 3 1
Sample Output
12.000000
-1
代碼如下:
#include <stdio.h>
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 <stdio.h>
#include <string.h>
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的情況,此時會將該子串中的每一個起點枚舉一遍。