Particle

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

SRM528 Div2

初参加

撃墜したかった。

Easy
やるだけ。n/2のところで結構考えて時間使ったけど、普通にi

class MinCostPalindrome{
public:
	int getMinimum(string s, int oCost, int xCost) {
		int n = s.size();
		int m = min(oCost,xCost);
		int ans = 0;
		for(int i = 0; i < n/2; i++){
			if((s[i] == 'o' && s[n-i-1] == 'x') ||( s[i] == 'x' && s[n-i-1] == 'o')) return -1;
			if(s[i] == '?' && s[n-i-1] == '?') ans += m*2;
			if((s[i] == '?' && s[n-i-1] == 'o') ||( s[i] == 'o' && s[n-i-1] == '?')) ans += oCost;
			if((s[i] == '?' && s[n-i-1] == 'x') ||( s[i] == 'x' && s[n-i-1] == '?')) ans += xCost;
		}
		return ans;
 	}
};

Medium
10の倍数で小さい方から考えるってだけ。

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

vector <int> t;
vector <int> g;


class Cut{
public:
	int getMaximum(vector <int> el, int cut) {
		int i,ans=0;
		int s = el.size();
		for(i=0;i<s; i++){
			if(el[i]%10 == 0) t.push_back(el[i]);
			else g.push_back(el[i]);
		}
		s = t.size();
		sort(t.begin(),t.end());
		for(i=0;i<s;i++){
			if(t[i]/10 <= cut+1){
				ans += t[i]/10;
				cut -= t[i]/10 - 1;
			}
			else{
				ans += cut;
				cut = 0;
			}
		}
		if(cut){
			s = g.size();
			for(i=0;i<s && cut;i++){
				if(g[i]/10 <= cut){
					ans += g[i]/10;
					cut -= g[i]/10;
				}
				else{
					ans += cut;
					cut = 0;
				}
			}
		}
		return ans;
 	}
};

Rating: null->1299
落ちないように頑張りたいですね