1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129
|
#include<bits/stdc++.h> using namespace std;
#define LL long long #define PII pair<int,int> #define PLL pair<LL,LL> #define MP make_pair #define F first #define S second #define INF INT_MAX
#define ALL(x) (x).begin(), (x).end() #define DBG(x) cerr << __LINE__ << " says: " << #x << " = " << (x) << endl
#include <ext/pb_ds/assoc_container.hpp> #include <ext/pb_ds/tree_policy.hpp> using namespace __gnu_pbds;
template<class TIn> using indexed_set = tree< TIn, null_type, less<TIn>, rb_tree_tag, tree_order_statistics_node_update>;
inline void optimizeIO() { ios_base::sync_with_stdio(false); cin.tie(NULL); }
const int nmax = 1e3+7; const LL LINF = 1e17;
string to_str(LL x) { stringstream ss; ss<<x; return ss.str(); }
int ara[nmax]; int n,k;
bool isPossible(int d) { int sum = 0; int cnt = 0;
for(int i=1; i<=n; i++) { if(d<ara[i]) return false;
if(sum+ara[i]<=d) sum += ara[i]; else cnt++, sum = ara[i]; }
cnt++; return cnt<=k; }
int main() {
int tc; scanf("%d",&tc);
for(int q=1; q<=tc; q++) { scanf("%d %d",&n,&k);
int cnt = 0;
for(int i=1; i<=n; i++) scanf("%d",&ara[i]);
int lo = 0, hi = INT_MAX , mid = 0;
int ans = lo;
while(lo<hi) { mid = lo + (hi-lo)/2;
if(isPossible(mid)) hi = mid, ans = mid; else lo = mid+1; }
printf("Case %d: %d\n",q,ans);
}
return 0; }
|