SRM 498 div2

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;
        }


你可能感兴趣的:(c,vector,String,div)