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
落ちないように頑張りたいですね