250pt:
題意:就是黑闆上有三個數,有n次選擇的機會,每次選擇哪個數可以得到和那個數相同的分數,然後黑闆上的該數減一。求n次選擇最多能得到多少分。(注意分數減到0後就不在減)。
思路:水題啊,每次選擇時排序即可,選擇最大的。
代碼:
int getMaximumPoints(int A, int B, int C, int N)
{
int i,j,k;
int sum = 0;
int num[3] = {A,B,C};
for(int i = 1;i <= N; ++i){
sort(num,num+3);
sum += num[2];
if(num[2] >= 1)
num[2]--;
}
return sum;
}
500pt:
題意:有這樣一種序列,s[0] < s[1] < s[2] < ... <s[a] > s[a+1] > s[a+2] > s[a+3] > ... >s[b] = s[b+1] = s[b+2] = ... = s[c] < s[c+1] < ... <s[d] > s[d+1] > s[d+2] > ... >s[n-1],而且小于的值都相等,也就是說s[0] 到 s[a] 是一個等差數列,s[a]到s[b]是一個等差數列,s[c] 到s[d] 是一個等差數列,s[d] 到 s[n-1] 是一個等差數列。判斷所給的序列中是否滿足這樣的條件。對應輸出“YES” 和“NO” 即可。
思路:其實就是模拟題了,不過細節問題需要注意,考慮清楚即可。
代碼:
string isValid(vector <int> seq)
{
int i,j,k;
string ss;
int flag = true;
int len = seq.size();
if(len < 5){
ss = "NO";
return ss;
}
else{
int a,b,c,d,e;
i = 1;
int x = seq[1] - seq[0];
if(x <= 0){
ss = "NO";
return ss;
}
while(i < len){
if(i >= len)
break;
while(seq[i+1] - seq[i] == x && x > 0){
i++;
}
a = i;
x = seq[i+1] - seq[i];
while(seq[i+1] - seq[i] == x && x < 0){
i++;
}
b = i;
x = 0;
while(seq[i+1] - seq[i] == x){
i++;
}
c = i;
x = seq[i+1] - seq[i];
while(seq[i+1] - seq[i] == x && x > 0){
i++;
}
d = i;
x = seq[i+1] - seq[i];
while(seq[i+1] - seq[i] == x && x < 0 ){
i++;
if(i == len-1)break;
}
e = i;
if(a < b && b <= c && c < d && d < e ){
if(e == len-1){
ss = "YES";
return ss;
}
else{
ss = "NO";
return ss;
}
}
else{
ss = "NO";
return ss;
}
if(i == len-1){
ss = "NO";
return ss;
break;
}
}
}
ss = "NO";
return ss;
}