답안 #448078

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
448078 2021-07-28T17:52:23 Z MohamedFaresNebili Job Scheduling (CEOI12_jobs) C++14
0 / 100
59 ms 8892 KB
#include <bits/stdc++.h>

using namespace std;

using ll  = long long;
using ull = unsigned long long;
using ld  = long double;
using db  = double;
using ii  = pair<int, int>;
using iii = pair<ii, int>;
using pl  = pair<ll, ll>;
using ti  = tuple<int, int, int>;
using tll = tuple<ll, ll, ll>;
using tld = tuple<ld, ld, ld>;
using vi  = vector<int>;
using vl  = vector<ll>;
using vii = vector<ii>;
using vpl = vector<pl>;
using vc  = vector<char>;
using vs  = vector<string>;

#define mp make_pair
#define pb push_back
#define pf push_front
#define pp pop_back
#define ppf pop_front
#define ff first
#define ss second
#define lb lower_bound
#define ub upper_bound
#define sz(v) ((int)v.size())
#define all(x) (x).begin() , (x).end()
#define mt make_tuple
#define FAST ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define parse(A, n) for ( ll K = 0; K < n; K++) { cin >> A[K]; }
#define process(A, n) for( ll K = 1; K <= n; K++) { cin >> A[K]; }
#define out(A, n) { for ( ll K = 0; K < n; K++) { cout <<(K!=0?" ":"")<<A[K]; } cout<<'\n'; }
#define show(x) { bool first=true; for(auto& a:x) { if(first) { first=false; } else { cout<<" "; } cout<<a; } cout<<'\n'; }
#define mem1(memo) memset(memo, -1, sizeof memo);
#define mem0(memo) memset(memo, 0, sizeof(memo);
#define print(k) printf("%.2lf\n", k)

ld dist(ld x, ld y, ld a, ld b)    { return sqrt((x-a)*(x-a) + (y-b)*(y-b)); }
ll gcd(ll a , ll b){ return b ? gcd(b , a % b) : a ;}
ll lcm(ll a , ll b){ return (a * b) / gcd(a , b);}
ll fact(ll n) { return n > 1?(n * fact(n-1)):1;}

void setIn(string s) { freopen(s.c_str(),"r",stdin); }
void setOut(string s) { freopen(s.c_str(),"w",stdout); }
void IO(string s = "") { if (sz(s)) { setIn(s+".in"), setOut(s+".out"); } }

const int N = 100024;
const int M = 1e6+24;
const int inf = 1e9;
const int MOD = 1e9+7;
const int nx[4] = {0, 0, 1, -1}, ny[4] = {1, -1, 0, 0}; //East, West, South, North
const int dr[8] = {1,1,0,-1,-1,-1, 0, 1}, dc[8] = {0,1,1, 1, 0,-1,-1,-1};  // S,SE,E,NE,N,NW,W,SW
const long long INF = 1e18;
const double EPS = 1e-9;
const double PI = 3.14159265358979323846;

/** |||||||||||||||||||||||||||||||| SOLUTION |||||||||||||||||||||||||||||||| **/

ll n, d, m;
bool can(ll val, vi a)
{
    vl p(n+2, 0);
    for(ll l=1;l<=n;l++) p[l]=p[l-1]+a[l];
    for(ll l=1;l<=n;l++) {
        ll diff=max(0LL, p[l]-val);
        p[l+1]+=diff; ll k=p[l]/val+(p[l]%val?1:0);
        if(k>d) return false;
    }
    return true;
}

void solve()
{
    /// JUST KEEP GOING
    cin>>n>>d>>m; vii t(m); vi a(n+2, 0);
    for(ll l=0;l<n;l++) {
        cin>>t[l].ff; t[l].ss=l+1;
        ll k=t[l].ff; a[k]++; a[k+1]--;
    }
    sort(all(t));
    ll lo=1, hi=m; ll ans;
    while(lo<=hi) {
        ll mid=(lo+hi)/2;
        if(can(mid, a)) { hi=mid-1; ans=mid; }
        else lo=mid+1;
    }
    cout<<ans<<'\n';
}

int32_t main()
{

    FAST; /// IO("outofplace");
    int t; t=1;
    while(t--)
    {
        solve();
    }
    return 0;

}

/*** Stuff you should look for :
   * int overflow, array bounds.
   * special cases (n=1?).
   * Observe The Constraints.
   * do smth instead of nothing and stay organized.
   * Reformulate The Problem Into Something More Theoretical.
   * Use flush operator when having TLE.
   * WRITE STUFF DOWN.
   * DON'T GET STUCK ON ONE APPROACH.
    Think of:
   * Brute force, Greedy(High->Low), Dynamic Programming, Divide and Conquer.
   * BFS, DFS, Flood Fill, Topological Sort, Bipartite Check, Articulation Points, SCC.
   * Minimum, Maximum Spanning Tree, SSSP, All-Pairs Shortest Paths, Network Flow.
   * Disjoint Set Union, Segment tree, Math, Two Pointers, Strings.
    Motivation :
   * Change Your Approach.
   * Don't Spend Too Much Time On The Problem: Move On!
   * If You Don't Fight You Cannot Win.
***/

Compilation message

jobs.cpp: In function 'void setIn(std::string)':
jobs.cpp:48:31: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   48 | void setIn(string s) { freopen(s.c_str(),"r",stdin); }
      |                        ~~~~~~~^~~~~~~~~~~~~~~~~~~~~
jobs.cpp: In function 'void setOut(std::string)':
jobs.cpp:49:32: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   49 | void setOut(string s) { freopen(s.c_str(),"w",stdout); }
      |                         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Incorrect 6 ms 1228 KB Output isn't correct
2 Incorrect 7 ms 1144 KB Output isn't correct
3 Incorrect 5 ms 1228 KB Output isn't correct
4 Incorrect 5 ms 1228 KB Output isn't correct
5 Incorrect 5 ms 1228 KB Output isn't correct
6 Incorrect 5 ms 1228 KB Output isn't correct
7 Incorrect 5 ms 1228 KB Output isn't correct
8 Incorrect 5 ms 1264 KB Output isn't correct
9 Incorrect 32 ms 2652 KB Output isn't correct
10 Incorrect 32 ms 2636 KB Output isn't correct
11 Incorrect 4 ms 1100 KB Output isn't correct
12 Incorrect 6 ms 1868 KB Output isn't correct
13 Incorrect 9 ms 2636 KB Output isn't correct
14 Incorrect 17 ms 3496 KB Output isn't correct
15 Incorrect 14 ms 4172 KB Output isn't correct
16 Incorrect 20 ms 5064 KB Output isn't correct
17 Incorrect 23 ms 5844 KB Output isn't correct
18 Incorrect 26 ms 6604 KB Output isn't correct
19 Incorrect 59 ms 8892 KB Output isn't correct
20 Incorrect 23 ms 5836 KB Output isn't correct