挑战程序设计3

二分答案
bool C(double x)
{
    int num=0;
    for (i=0; i<n; i++)
        num+=l[i]/x;
    return num>=k
}
l=0;
r=INF;
for (i=0; i<=100; i++)
{
    double mid=(l+r)/2;
    if (C(mid))
        l=mid;
    else
        r=mid;
}
printf("%.2f\n",floor(l*100)/100);

 

bool C(int d)
{
    int l=0;
    for (i=1; i<m; i++)
    {
        int k=l+1;
        while(k<n&&x[k]-x[l]<d)
        {
            k++;
        }
        if (k==n)
            return 0;
        l=k;
    }
    return 1;
}
sort(x,x+n);
l=0;
r=INF;
while (r-l>1)
{
    int mid=(l+r)>>1;
    if (C(mid))
        l=mid;
    else
        r=mid;
}
printf("%d\n",l);

bool C(double x)
{
    for (int i=0; i<n; i++)
    {
        y[i]=v[i]-x*w[i];
    }
    sort(y,y+n);
    double sum=0;
    for (int i=0; i<k; i++)
        sum+=y[n-i-1];
    return sum>=0;
}
l=0;
r=INF;
for (int i=0; i<=100; i++)
{
    double mid=(l+r)/2;
    if (C(mid))
        l=mid;
    else
        r=mid;
}
printf("%.2f\n",l);

 

for (i=0; i<n; i++)
{
    sum[i+1]=sum[i]+a[i];
}
if (sum[n]<S)
{
    printf("0\n");
    return 0;
}
ans=n;
for (s=0; sum[s]+S<=sum[n]; s++)
{
    int t=lower_bound(sum+s,sum+n,sum[s]+S)-sum;
    ans=min(ans,t-s);
}
printf("%d\n",ans);

int ans=n+1;
while (1){
	while (t<n&&sum<S){
		sum+=a[t++];
	}
	if (sum<S) break;
ans=min(ans,t-s);
sum-=a[s++];
}
if (ans>n){
	ans=0;
}
printf("%d\n",ans);

set<int>all;
for (i=0; i<p; i++)
{
    all.insert(a[i]);
}
n=all.size();
map<int,int>c;
ans=p;
while (1)
{
    while (t<p&&num<n)
    {
        if (c[a[t++]]++==0)
        {
            num++;
        }
    }
    if (num<n)
        break;
    ans=min(ans,t-s);
    if (--c[a[s++]]==0)
    {
        num--;
    }
}
printf("%d\n",ans);

 

 

for (i=0; i<n; i++)
	for (j=0; j<n; j++)
		cd[i*n+j]=c[i]+d[j];
sort(cd,cd+n*n);
for (i=0; i<n; i++)
	for (j=0; j<n; j++) {
		k=-a[i]-b[j];
		ans+=upper_bound(cd,cd+n*n,k)-lower_bound(cd,cd+n*n,k);
	}
printf("%d\n",ans);

 

pair<ll,ll>p[1<<(maxn/2)];// (重量, 价值)
n2=n/2;
for (i=0; i<1<<n2; i++) {
	ll sw=0,sv=0;
	for (j=0; j<n2; j++) {
		if (i>>j&1) {
			sw+=w[j];
			sv+=v[j];
		}
	}
	p[i]=make_pair(sw,sv);
}
// 去除多余的元素
sort(p,p+(1<<n2));
m=1;
for (i=1; i<(1<<n2); i++) {
	if (p[m-1].second<p[i].second) {
		p[m++]=p[i];
	}
}
// 枚举后半部分并求解
ans=0;
for (i=0; i<(1<<(n-n2)); i++) {
	ll sw=0,sv=0;
	for (j=0; j<n-n2; j++) {
		if (i>>j &1) {
			sw+=w[n2+j];
			sv+=v[n2+j];
		}
	}
	if (sw<=W) {
		t=(lower_bound(p,p+m,make_pair(w-sw,INF))-1)->second;
		ans=max(ans,sv+tv);
	}
}
printf("%d\n",ans);

猜你喜欢

转载自blog.csdn.net/weixin_43601103/article/details/87897610