SRM240 DIV2
: easy문제 치고는 까다로운 문제..
class Pronunciation
{
public:
string canPronounce(vector <string> w)
{
char sub;
REP(i, w.size())
{
string s = w[i];
int cnt_v = 0, cnt_c = 0;
char before, s1;
REP(j, s.size())
{
s1 = toupper(s[j]);
if( s1 == 'A' || s1=='E'|| s1 == 'I' || s1 == 'O' || s1 == 'U' )
{
cnt_v++;
cnt_c = 0;
if( j > 0 && s1 == before )
cnt_v--;
}
else
{
cnt_v = 0;
cnt_c++;
}
if( cnt_v > 1 || cnt_c > 2 )
{
return s;
}
before = s1;
}
}
return "";
}
};
SRM241 DIV2
: 블랙잭 규칙을 몰라서, 두번이나 틀렸다..
player만 블랙잭이고, 둘이 비기면 player가 이긴다는 내용이 어디있단 말인가;; 그리 좋지않은 문제..
class BlackjackWinner
{
public:
int winnings(int bet, int d, int db, int p, int pb)
{
if(pb == 1 && db == 1) return 0;
if(pb == 1 && db == 0) return bet*1.5;
else if(pb == 0 && db == 1) return -bet;
if( p > 21) return -1 * bet;
else if(d > 21) return bet;
else if(p == d) return 0;
else if(p > d) return bet;
else return -bet;
return 0;
}
};
SRM242 DIV2
:1) sort한후 reverse하는거 보다 sort(ALL(s), greater<int>()) 로 하는 걸 연습.
2) 팀별로 vector에 넣은 후에 합을 구할 필요없이, a팀이면 +, b팀이면 - 시키면 바로 해를 구할 수 있었음.
class TeamSplit
{
public:
int difference(vector <int> s)
{
VI a, b;
sort(ALL(s));
reverse(ALL(s));
REP(i, s.size())
{
if( i % 2 == 0) a.pb(s[i]);
else b.pb(s[i]);
}
int ateam=0, bteam = 0;
REP(i, a.size())
ateam += a[i];
REP(i, b.size())
bteam += b[i];
return ateam - bteam;
}
};
SRM243 DIV2
(1) pow나 log함수 호출할때 양쪽다 (double)을 씌워주지 않으면 결과가 이상하게 나올 수 있음
(2) int의 INT_MAX와 같이 가장 큰값을 초기에 주는 걸 몰라서, 첫번째 값을 구해서 넣었는데..
double에서는 double min = 1e100; 으로 해주면 되나보다.
class ComputationalComplexity
{
public:
int fastestAlgo(vector <int> c, vector <int> p, vector <int> l, int N)
{
int n = c.size();
double min = c[0]*pow((double)N, (double)p[0]) * pow(log((double)N), (double)l[0]);
int ret = 0;
for(int i = 1; i<n; i++)
{
double a1 = c[i]*pow((double)N, (double)p[i]) * pow(log((double)N), (double)l[i]);
if( min > a1 )
{
min = a1;
ret = i;
}
}
return ret;
}
};
SRM244 DIV2
: 어디선가 본 듯한 문제
class Grader
{
public:
vector <int> grade(vector <int> p, vector <int> a)
{
vector<int> r(7, 0);
int n = p.size();
REP(i, n)
r[abs(p[i] - a[i])]++;
REP(i, 7)
r[i] = r[i] * 100 / n;
return r;
}
};
SRM245 DIV2
: 좋은 문제인듯. 나중에 다시 한번 풀어볼 것.
class Straights
{
public:
int howMany(vector <int> h, int k)
{
int ret = 0;
REP(i, 13-k+1)
{
int sub = 1;
for(int j=0; j<k ; j++)
sub *= h[i+j];
ret += sub;
}
return ret;
}
};
SRM246 DIV2
class CalcTest
{
public:
vector <string> uniform(vector <string> n)
{
vector<string> ret;
REP(i, n.size())
{
string s = n[i];
string r;
REP(j, s.size())
{
if(s[j] == ' ') continue;
if(s[j] < '0' || s[j] > '9') r += '.';
else r += s[j];
}
ret.pb(r);
}
return ret;
}
};
SRM247 DIV2
class TriangleType
{
public:
string type(int a, int b, int c)
{
vector<int> t;
t.pb(a);
t.pb(b);
t.pb(c);
sort(ALL(t));
if( t[0] + t[1] <= t[2]) return "IMPOSSIBLE";
if( t[0]*t[0] + t[1]*t[1] == t[2]*t[2] ) return "RIGHT";
if( t[0]*t[0] + t[1]*t[1] > t[2]*t[2] ) return "ACUTE";
if( t[0]*t[0] + t[1]*t[1] < t[2]*t[2] ) return "OBTUSE";
}
};
SRM248 DIV2
이전char에서 모음여부를 bool로 가지고 있으면서 비교해 줬어도 되는 문제
class SyllableCounter
{
public:
int countSyllables(string w)
{
int ret = 0;
REP(i, w.size())
{
if((w[i] == 'A' || w[i] == 'E' || w[i] == 'I' || w[i] == 'O' || w[i] == 'U' )
&& (i == 0 || (w[i-1]!='A' && w[i-1] != 'E' && w[i-1] != 'I' && w[i-1] != 'O' && w[i-1] != 'U' )))
{
ret++;
}
}
return ret;
}
};
SRM249 DIV2
: name에 ':' 를 붙여서 바로 비교하는 방법도 있었군..
class ChatTranscript
{
public:
int howMany(vector <string> t, string n)
{
int ret = 0;
string s;
REP(i, t.size())
{
s = t[i];
if( s.size() > n.size() && s.substr(0, n.size()) == n && s[n.size()] == ':')
ret++;
}
return ret;
}
};