Particle

競技プログラミングについての雑記

SRM540 Div2

Easy(122.18/250)
条件を注意して読みましょう。最初からちゃんと読んでいれば、余裕で240点代出せます。
バグ対策[要出典]にソートした人はあまりいなさそうでした。

#include <algorithm>
#include <cmath>
#include <ctime>
#include <iostream>
#include <string>
#include <vector>
using namespace std;

class RandomColoringDiv2{
public:
	int getCount(int maxR, int maxG, int maxB, int R, int G, int B, int d1, int d2) {
		int ans = 0;
		for(int i = 0; i < maxR; i++){
			for(int j = 0; j < maxG; j++){
				for(int k = 0; k < maxB; k++){
					int a[3];
					a[0] = abs(i-R);
					a[1] = abs(j-G);
					a[2] = abs(k-B);
					sort(a,a+3);
					if(d1<=a[2]&&a[2]<=d2)ans++;
				}
			}
		}
		return ans;
 	}
};

Medium(0/500)
色々面倒な問題。550でいいと思います。

まず、初項を1と仮定する。
初項がk増えるときに、k増える項とk減る項がある('+'のとき、左の項と逆で、'-'のとき、同じ。)から、両方ともすべて正の整数になるようなkの個数を求めれば良い。

#include <algorithm>
#include <cmath>
#include <ctime>
#include <iostream>
#include <string>
#include <vector>
using namespace std;
typedef long long ll;

ll num[51];//本番ではintにしてた。

class ImportantSequence{
public:
	int getCount(vector <int> B, string op) {
		int len = B.size();
		for(int i = 0; i <= len; i++){
			if(i==len)return -1;
			if(op[i]!='-')break;
		}
		
		num[0] = 1;
		for(int j = 0; j < len; j++){
			if(op[j]=='+'){
				num[j+1] = B[j]-num[j];
			}else{
				num[j+1] = -B[j]+num[j];
			}
		}
		int f = 1;
		ll plus = 1,minus = 1000000000000LL;//本番では10^9にしてた。たぶん
		for(int i = 0; i < len; i++){
			if(op[i]=='+'){
				f = !f;
			}
			if(f){
				plus = min(plus,num[i+1]);
			}else{
				minus = min(minus,num[i+1]);
			}
		}
		if(plus<=0) minus += plus-1;
		return minus>0?minus:0;//本番ではreturn minus;にしてた(plusを足す前に負になるパターンは除いていた)
 	}
};

Hard(Opened/1000)







Score 122.18
Rating 1192 -> 1126