codeforce 1600
COFO::1217B Zmei Gorynhich
cofo problem
COFO::1217B Zmei Gorynich
Problem
- level : 1600
- tag : greedy, math
- TIME
- to understand : 10
- to algorithm : 5
- to code : 5
- to debug : 5
- understanding edit : 0
Point
- x개의 머리를 가진 몬스터가 있습니다.
- n개의 set가 주어집니다.
- d개의 머리를 없앨 수 있습니다.
- 이후, h개의 머리가 추가로 생깁니다.
- 이때, 최소한의 set갯수 사용으로 몬스터의 머리 갯수를 0으로 만드려고 합니다.
- 최소 set를 출력하시오
Design
- 명백한 수학문제입니다.
- 용의 머리를 때릴때마다 갯수가 변합니다.
- d - h의 값이 가장 큰 set를 골라야 용의 머리를 빠르게 줄여나갈 수 있는 것을 눈치챌 수 있습니다.
- 이제 예외처리만 추가해주면 됩니다.
- 마지막 타격의 경우 d만 적용되고 h가 적용되지 않습니다.
- 즉, 용의 머리가 이미 0인 경우 추가로 용의 머리가 h개 만큼 추가되지 않습니다.
- 따라서, 마지막 타를 먼저 때려놓고 나머지를 진행하는 경우도 같이 비교해주어야 합니다.
Complexity
- O(N)
Code
#include<bits/stdc++.h>
#define all(a) a.begin(), a.end()
#define sz(a) (int) a.size()
#define rep(i, a, b) for(int i=(a); i <(b); i++)
#define r_rep(i, a, b) for(int i=(a); i >(b); i--)
typedef long long ll;
using namespace std;
ll n, x;
void solve () {
cin >> n >> x;
vector<ll> d;
vector<ll> diff; // d - h
rep(i, 0, n) {
ll a, b;
cin >> a >> b;
d.push_back(a);
diff.push_back(a - b);
}
sort(d.rbegin(), d.rend());
sort(diff.rbegin(), diff.rend());
if (x <= d[0]) {
cout <<"1\n";
return;
}
if (diff[0] <= 0) {
cout << "-1\n";
return;
}
ll q = (x + diff[0] - 1) / diff[0];
ll x2 = x - d[0];
ll q2 = (x2 + diff[0] - 1) / diff[0] + 1;
cout << min(q, q2) << '\n';
}
int main(){
int tc; cin >> tc;
while(tc--) {
solve();
}
return 0;
}