본문 바로가기

코드포스

[코드포스 Practice18] C. Vanya and Exams

 

문제 이해는 했는데 어떻게 풀지를 모르겠다

 

내가 생각한 걸로는 그냥 평균 이하를 다 하나씩 바꿔서 개수 세는 거...

(이것도 잘 모르겠음)

 

헉 이거 안 어려웠다!

 

실수 평균 때문에 어찌하지 고민했는데 평균 말고 합으로 생각하면 쉽게 풀린다.

 

 

#include <iostream>
#include <algorithm>
#include <vector>
#include <string>
#include <functional>
#include <string>
#include <queue>
#include <stack>
#include <set>
 
using namespace std;
using i64 = long long;
using ii = pair<int, int>;

bool sortbysecond(const pair<int,int> &a, const pair<int,int> &b) 
{ 
    return (a.second < b.second); 
}

int main() {
    int n, r, avg;
    scanf("%d %d %d", &n, &r, &avg);
    
    int sum = 0;
    vector<pair<int, int>> v(n);
    for (int i = 0; i < n; i++)
    {
        scanf("%d %d", &v[i].first, &v[i].second);
        sum += v[i].first;
        v[i].first = r - v[i].first;
    }
    sort(v.begin(), v.end(), sortbysecond);
    
    i64 count = avg * n - sum;
    i64 ans = 0;
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < v[i].first; j++)
        {
            if (count <= 0)
                break;
            ans += v[i].second;
            count--;
        }
    }
    cout << ans;
    
    return 0;
}

 

떼잉.. 시간초과 났다.

오늘 코포 풀었는데 그 문제랑 비슷한 느낌임

설명하기 어려운데 값을 최대한 채워넣고 나머지 채우는 그런 거... 어렵다... 헝

어려운게 아닌데 걍 내가 어려워하는 것 같음

 

 

 

으힝헝힝 고쳤다

오늘 했던 거라 그나마 빨리 짰다

 

#include <iostream>
#include <algorithm>
#include <vector>
#include <string>
#include <functional>
#include <string>
#include <queue>
#include <stack>
#include <set>
 
using namespace std;
using i64 = long long;
using ii = pair<int, int>;

bool sortbysecond(const pair<int,int> &a, const pair<int,int> &b) 
{ 
    return (a.second < b.second); 
}

int main() {
    int n, r, avg;
    scanf("%d %d %d", &n, &r, &avg);
    
    i64 sum = 0;
    vector<pair<int, int>> v(n);
    for (int i = 0; i < n; i++)
    {
        scanf("%d %d", &v[i].first, &v[i].second);
        sum += v[i].first;
        v[i].first = r - v[i].first;
    }
    sort(v.begin(), v.end(), sortbysecond);
    
    i64 count = 0;
    i64 ans = 0;
    i64 calc = n * (i64)avg - sum;
    
    if (calc <= 0)
    {
        cout << "0";
        return 0;
    }
    for (int i = 0; i < n; i++)
    {
        if (v[i].first + count < calc)
        {
            count += v[i].first;
            ans += (i64)v[i].second * v[i].first;
        }
        else
        {
            ans += (i64)v[i].second * (calc - count);
            break;
        }
    }
    cout << ans;
    
    return 0;
}

 

ㅠ________ㅠ

다시 보기 싫어

 

i64 안 해서 한 5번은 낸듯

터질지 안 터질지 다음부터 미리 계산하자