A. Splits
A 번 문제가 아니었다면 못풀었을 것 같다.
A라 분명 쉬울껀데 하면서 계속 해보니까
결국 중요한 건 맨 앞에 오는 숫자의 개수이고 뒤는 1로 다 채워버려도 됐다.
어떤 숫자가 n이라면
n개를 다 1로 채우는 방법,
n개에서 한개를 2로하고 나머지를 1로 채우는 방법
n개에서 2개를 2로하고 나머지를 1로 채우는 방법
...
n개에서 n/2개를 2로하고 나머지가 있다면 1로 두는 방법 으로 구할 수 있다.
따라서 모든 방법의 수는 n/2+1
#include <iostream>
using namespace std;
int main(void)
{
int n;
cin >> n;
cout << n / 2 + 1;
return 0;
}
B. Messages
브루트포스로 풀었다.
편지를 안 읽고 두냐, 아니면 얼른 읽어버리냐의 최대값의 차이는
이런 수식으로 구할 수 있었다. ti를 편지를 받은 tb[i] 부터 끝까지 가지고 있는 <= t 로 범위를 준 후 다 해본다음의 max 값을 ans 에 더해줘서 구했다.
이게 될까 싶었는데 돌려보니 바로 Accept 가 떠서 신기했다.
#include <iostream>
#include <algorithm>
using namespace std;
int tb1[100001];
int main(void)
{
int n, a, b, c, t;
cin >> n >> a >> b >> c >> t;
for (int i = 0; i<n; ++i) {
cin >> tb1[i];
}
int ans = 0;
for (int i = 0; i<n; ++i) {
int tmax = 0;
for (int ti = tb1[i]; ti <= t; ++ti) {
int temp = (t - ti)*c + (a - b * (t - ti));
tmax = max(tmax, temp);
}
ans += tmax;
}
cout << ans << endl;
return 0;
}