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


브루트포스로 풀었다. 

편지를 안 읽고 두냐, 아니면 얼른 읽어버리냐의 최대값의 차이는 

(t-ti)*c + (a-b*(t-ti))

이런 수식으로 구할 수 있었다. 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;
}






+ Recent posts