More actions
imported>trailblaze No edit summary |
imported>trailblaze No edit summary |
||
| Line 1: | Line 1: | ||
아무래도 세 문제 전부 parametric search를 이용한 문제라서 한 페이지에 넣어야 될 듯 싶네여. 페이지 낭비 같음. | |||
* subsequence | |||
#include<iostream> | #include<iostream> | ||
#include<vector> | #include<vector> | ||
| Line 32: | Line 35: | ||
} | } | ||
if(ans == 100020)ans = 0; | if(ans == 100020)ans = 0; | ||
cout<<ans; | |||
return 0; | |||
} | |||
* drying | |||
#include<iostream> | |||
#include<vector> | |||
using namespace std; | |||
vector <int> laundry; | |||
int main(void) | |||
{ | |||
int n, k, i, ans, temp = 0; | |||
int low, high = 0, mid; | |||
low = 0; | |||
cin>>n; | |||
laundry.resize(n + 5); | |||
for(i = 0; i<n; i++){ | |||
cin>>laundry[i]; | |||
} | |||
cin>>k; | |||
for(i = 0; i<n; i++)high += (laundry[i] + (k - 1)) / k; | |||
ans = high + 1; | |||
while(low <= high) | |||
{ | |||
temp = 0; | |||
mid = (low + high) / 2; | |||
for(i = 0; i<n; i++){ | |||
if(laundry[i] - mid > 0){ | |||
if(k - 1 <= 0)temp += laundry[i] - mid; | |||
else temp += (laundry[i] - mid + (k - 2)) / (k-1); | |||
} | |||
} | |||
if(temp <= mid){ | |||
if(ans > mid)ans = mid; | |||
high = mid - 1; | |||
} | |||
else low = mid + 1; | |||
} | |||
cout<<ans; | |||
return 0; | |||
} | |||
* aggressive cow | |||
#include<iostream> | |||
#include<algorithm> | |||
#include<vector> | |||
using namespace std; | |||
vector <int> barn; | |||
int main(void) | |||
{ | |||
int low, high, mid, ans = 0; | |||
int n, c, temp, count; | |||
int i; | |||
cin>>n>>c; | |||
barn.resize(n + 5); | |||
for(i = 0; i<n; i++){ | |||
cin>>barn[i]; | |||
} | |||
sort(barn.begin(), barn.begin() + n); | |||
low = 1; | |||
high = barn[n - 1] - barn[0]; | |||
while(low <= high) | |||
{ | |||
count = 0; | |||
mid = (low + high) / 2; | |||
for(i = 1, temp = 0; i<n; i++){ | |||
if(barn[i] - barn[temp] >= mid){ | |||
count++; | |||
temp = i; | |||
} | |||
} | |||
if(count >= c-1){ | |||
if(ans < mid)ans = mid; | |||
low = mid + 1; | |||
} | |||
else high = mid - 1; | |||
} | |||
cout<<ans; | cout<<ans; | ||
return 0; | return 0; | ||
} | } | ||
Latest revision as of 11:18, 14 January 2013
아무래도 세 문제 전부 parametric search를 이용한 문제라서 한 페이지에 넣어야 될 듯 싶네여. 페이지 낭비 같음.
- subsequence
#include<iostream>
#include<vector>
using namespace std;
vector <int> e, sum;
int main(void)
{
int n, s;
int l, h, m, i, ans = 100020;
bool flag = false;
cin>>n>>s;
e.resize(n + 5);
sum.resize(n + 5);
for(i = 1; i<=n; i++){
cin>>e[i];
sum[i] = sum[i-1] + e[i];
}
l = 0, h = n;
while(l <= h){
flag = false;
m = (l + h) / 2;
for(i = m; i<=n; i++){
if(sum[i] - sum[i - m] >= s) {
flag = true;
if(ans > m)ans = m;
break;
}
}
if(!flag)l = m + 1;
else h = m - 1;
}
if(ans == 100020)ans = 0;
cout<<ans;
return 0;
}
- drying
#include<iostream>
#include<vector>
using namespace std;
vector <int> laundry;
int main(void)
{
int n, k, i, ans, temp = 0;
int low, high = 0, mid;
low = 0;
cin>>n;
laundry.resize(n + 5);
for(i = 0; i<n; i++){
cin>>laundry[i];
}
cin>>k;
for(i = 0; i<n; i++)high += (laundry[i] + (k - 1)) / k;
ans = high + 1;
while(low <= high)
{
temp = 0;
mid = (low + high) / 2;
for(i = 0; i<n; i++){
if(laundry[i] - mid > 0){
if(k - 1 <= 0)temp += laundry[i] - mid;
else temp += (laundry[i] - mid + (k - 2)) / (k-1);
}
}
if(temp <= mid){
if(ans > mid)ans = mid;
high = mid - 1;
}
else low = mid + 1;
}
cout<<ans;
return 0;
}
- aggressive cow
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
vector <int> barn;
int main(void)
{
int low, high, mid, ans = 0;
int n, c, temp, count;
int i;
cin>>n>>c;
barn.resize(n + 5);
for(i = 0; i<n; i++){
cin>>barn[i];
}
sort(barn.begin(), barn.begin() + n);
low = 1;
high = barn[n - 1] - barn[0];
while(low <= high)
{
count = 0;
mid = (low + high) / 2;
for(i = 1, temp = 0; i<n; i++){
if(barn[i] - barn[temp] >= mid){
count++;
temp = i;
}
}
if(count >= c-1){
if(ans < mid)ans = mid;
low = mid + 1;
}
else high = mid - 1;
}
cout<<ans;
return 0;
}