Hướng dẫn giải của Bus
Chỉ dùng lời giải này khi không có ý tưởng, và đừng copy-paste code từ lời giải này. Hãy tôn trọng người ra đề và người viết lời giải.
Nộp một lời giải chính thức trước khi tự giải là một hành động có thể bị ban.
Nộp một lời giải chính thức trước khi tự giải là một hành động có thể bị ban.
Lưu ý: Các code mẫu dưới đây chỉ mang tính tham khảo và có thể không AC được bài tập này
Code mẫu của flashmt
const fi=''; fo=''; var n,m,i,j,re,x,y,t,s:longint; a:array[0..200100] of longint; procedure sort(l,r:longint); var i,j,x,y:Longint; begin i:=l; j:=r; x:=a[(i+j) shr 1]; repeat while a[i]<x do i:=i+1; while a[j]>x do j:=j-1; if i<=j then begin y:=a[i]; a[i]:=a[j]; a[j]:=y; i:=i+1; j:=j-1; end; until i>j; if i<r then sort(i,r); if l<j then sort(l,j); end; begin assign(input,fi); reset(input); assign(output,fo); rewrite(output); read(n,m); for i:=1 to n do begin read(t,x); for j:=1 to x do begin read(y); if y<=re then m:=m-1 else begin s:=s+1; a[s]:=y-re; end; end; re:=re+t; end; if (s>0) and (m>0) then sort(1,s); if m>0 then re:=re+a[m]; writeln(re); close(output); close(input); end.
Code mẫu của happyboy99x
#include<algorithm> #include<climits> #include<cstdio> #include<vector> using namespace std; #define N 200000 int n, m, t[N]; vector<int> a[N]; void enter() { scanf("%d%d",&n,&m); int staff = 0; for(int i = 0; i < n; ++i) { scanf("%d", t+i); int p; scanf("%d", &p); staff += p; while(p--) { int tmp; scanf("%d", &tmp); a[i].push_back(tmp); } sort(a[i].begin(), a[i].end()); } m = min(staff, m); } void solve() { int lo = 0, hi = INT_MAX; while(lo < hi) { int mid = (lo + hi) / 2; int cnt = 0; for(int time = mid, i = 0; i < n && cnt < m; time += t[i++]) cnt += upper_bound(a[i].begin(), a[i].end(), time) - a[i].begin(); if(cnt >= m) hi = mid; else lo = mid + 1; } for(int i = 0; i < n; lo += t[i++]); printf("%d\n", lo); } int main() { #ifndef ONLINE_JUDGE freopen("input.txt", "r", stdin); #endif enter(); solve(); return 0; }
Code mẫu của ladpro98
#include <cstring> #include <vector> #include <list> #include <map> #include <set> #include <queue> #include <deque> #include <stack> #include <bitset> #include <algorithm> #include <functional> #include <numeric> #include <utility> #include <sstream> #include <iostream> #include <iomanip> #include <cstdio> #include <cmath> #include <climits> #include <cstdlib> #include <ctime> #include <memory.h> #include <cassert> #include <climits> #define FOR(i, a, b) for(int i = (a); i < (b); i++) #define REP(i, a, b) for(int i = (a); i <=(b); i++) #define FORD(i, a, b) for(int i = (a); i > (b); i--) #define REPD(i, a, b) for(int i = (a); i >=(b); i--) #define TR(it, a) for(typeof((a).begin()) it = (a).begin(); it != (a).end(); it++) #define RESET(a, v) memset((a), (v), sizeof((a))) #define SZ(a) (int((a).size())) #define ALL(a) (a).begin(), (a).end() #define PB push_back #define MP make_pair #define LL long long #define LD long double #define II pair<int, int> #define X first #define Y second #define VI vector<int> const int N = 202020; using namespace std; int delayTime[N]; LL sumDelay; VI people[N]; int totalPeople; int n, m; int cnt(LL delay) { int ret = 0, now = delay; FOR(i, 0, n) { TR(it, people[i]) ret += *it <= now; now += delayTime[i]; } return ret; } int main() { ios :: sync_with_stdio(0); cin.tie(0); cin >> n >> m; int k; FOR(i, 0, n) { cin >> delayTime[i] >> k; people[i] = VI(k); FOR(j, 0, k) cin >> people[i][j]; totalPeople += k; sumDelay += delayTime[i]; } int maxCarry = min(totalPeople, m); LL l = 0, r = INT_MAX, ans; while (l <= r) { LL mid = (l + r) >> 1; if (cnt(mid) >= maxCarry) { ans = mid; r = mid - 1; } else l = mid + 1; } cout << ans + sumDelay; return 0; }
Code mẫu của RR
{$R-,Q-} uses math; const FINP=''; FOUT=''; MAXN=200001; var n,m,sl:int64; a,d,ind,l,r:array[1..MAXN] of int64; procedure inp; var f:text; i,j,k:longint; begin assign(f,FINP); reset(f); read(f,n,m); sl:=0; for i:=1 to n do begin read(f,d[i],k); for j:=1 to k do begin inc(sl); read(f,a[sl]); ind[sl]:=i; end; end; close(f); end; procedure solve; var i:longint; begin l[1]:=0; for i:=2 to n do l[i]:=l[i-1]+d[i-1]; r[n+1]:=0; for i:=n downto 1 do r[i]:=r[i+1]+d[i]; for i:=1 to sl do a[i]:=max(l[ind[i]],a[i])+r[ind[i]]; end; procedure swap(var a,b:int64); inline; var temp:int64; begin temp:=a; a:=b; b:=temp; end; procedure sort(l,r:int64); inline; var i,j,mid:int64; begin i:=l; j:=r; mid:=a[(l+r) shr 1]; repeat while a[i]<mid do inc(i); while a[j]>mid do dec(j); if i<=j then begin swap(a[i],a[j]); inc(i); dec(j); end; until i>j; if i<r then sort(i,r); if l<j then sort(l,j); end; procedure ans; var f:text; begin assign(f,FOUT); rewrite(f); writeln(f,a[m]); close(f); end; begin inp; solve; sort(1,sl); if m>sl then m:=sl; ans; end.
Code mẫu của hieult
#include <iostream> #include <algorithm> #include <cstdlib> using namespace std; long long A[200002]; int compare(const void *a, const void *b) { return (* (int*)a-*(int*) b ); } int main() { long long m,n,sum=0,tg,snv,nv,count=0,i,j; // //freopen("input.txt","r",stdin); //freopen("output.txt","w",stdout); // scanf("%lld%lld",&n,&m); memset(A,0,sizeof A); for (i=1;i<=n;i++) { scanf("%lld%lld",&tg,&snv); for (j=1;j<=snv;j++){ scanf("%lld",&nv); if (nv>sum) A[count]=nv-sum; //else A[count]=0; count++; } sum=sum+tg; } // sort(A,A+count); qsort(A,count,sizeof(long long),compare); // //for (i=0;i<count;i++) cout<<A[i]<<" "; //cout<<endl; // //cout<<sum<<endl; sum=sum+A[m-1]; printf("%lld\n",sum); }
Code mẫu của ll931110
{$MODE DELPHI} program NKBUS; const input = ''; output = ''; maxn = 200001; var n,m,res,num: integer; a,st,t,d: array[1..maxn] of integer; procedure init; var f: text; i,j,num: integer; begin assign(f, input); reset(f); readln(f, n, m); st[1] := 1; for i := 1 to n do begin read(f, d[i], num); for j := 0 to num - 1 do read(f, a[st[i] + j]); st[i + 1] := st[i] + num; end; close(f); end; procedure swap(var x,y: integer); var z: integer; begin z := x; x := y; y := z; end; procedure qsort(l,h: integer); var i,j,p: integer; begin if l >= h then exit; i := l; j := h; p := a[random(h - l + 1) + l]; repeat while a[i] < p do inc(i); while a[j] > p do dec(j); if i <= j then begin if i < j then swap(a[i],a[j]); inc(i); dec(j); end; until i > j; qsort(l,j); qsort(i,h); end; function calc(i: integer): integer; var inf,sup,med,k: integer; begin inf := st[i]; sup := st[i + 1] - 1; if inf > sup then exit(0); if a[inf] > t[i] then exit(0); repeat med := (inf + sup) div 2; if a[med] > t[i] then sup := med - 1 else begin k := med; inf := med + 1; end; until inf > sup; calc := k - st[i] + 1; end; function intime(x: integer): boolean; var i,tot: integer; begin t[n + 1] := x; for i := n downto 1 do t[i] := t[i + 1] - d[i]; if d[1] < 0 then exit(false); tot := 0; for i := 1 to n do tot := tot + calc(i); intime := tot >= num; end; procedure solve; var i,sum: integer; inf,sup,med: integer; begin if st[n + 1] > m then num := m else num := st[n + 1] - 1; for i := 1 to n do qsort(st[i],st[i + 1] - 1); sum := 0; for i := 1 to n do sum := sum + d[i]; inf := sum; sup := high(integer); repeat med := (inf + sup) div 2; if not intime(med) then inf := med + 1 else begin res := med; sup := med - 1; end; until inf > sup; end; procedure printresult; var f: text; begin assign(f, output); rewrite(f); writeln(f, res); close(f); end; begin init; solve; printresult; end.
Code mẫu của khuc_tuan
#include <iostream> #include <queue> using namespace std; int main() { int n, m; priority_queue<int, vector<int>, greater<int> > q; scanf("%d%d", &n, &m); int total_time = 0; for(int i=0;i<n;++i) { int x, k, t; scanf("%d%d", &x, &k); for(int j=0;j<k;++j) { scanf("%d", &t); if(t < total_time) t = total_time; q.push(t - total_time); } total_time += x; } int res = 0; for(int i=0;i<m;++i) if(q.size()>0) { res = q.top(); q.pop(); } cout << res + total_time << endl; return 0; }
Bình luận