2012-0078

从 Trac 迁移的文章

这是从旧校内 Wiki 迁移的文章,可能存在一些样式问题,您可以向 memset0 反馈。

原文章内容如下:

令x=max(r[i-1],l[i]), 然后total=s+max(x)。 用dmin[i]记录第i个餐馆和第一个餐馆相同的菜的最小值,dmax[i]是最大值,然后递推出dmin[n-1] 比较 dmin[n-1]+x-s的大小,添加到结果中。
递推在源代码里。
{{{
#include<iostream>
#include<cmath>
#include<algorithm>
using namespace std;


void SAISEI(int n, int m, int t1, int t2, int L[], int R[])
{
srand(t1);
for (int i = 0; i < n; i++)
L[i] = rand() % m;
srand(t2);
for (int i = 0; i < n; i++)
R[i] = rand() % m;
}

int main()
{
    //freopen("in","r",stdin); 
    //freopen("out","w",stdout);
    int n,s,t1,t2,m;
    while(cin>>n>>s>>t1>>t2>>m)
    {
        int l[200001];
        int r[200001];
        int dmin[200001];
        int dmax[200001];
        SAISEI(n,m,t1,t2,l,r);
        int flag=0;
        dmin[0]=s;
        dmax[0]=s;
        int total=0;
        for(int i=0;i<n;i++)
        {
            if(s<r[i]||s<l[i])
            {
                cout<<"AHOU\n";
                flag=1;
                break;
            }
            total=max(total,s+max(r[i],l[(i+1)%n]));
        }
        if(flag==1)
            continue;
        for(int i=1;i<n;i++)
        {
            int x=max(r[i-1],l[i]);
            if(x<dmin[i-1])
            {
                dmin[i]=max(0,x-total+2*s-dmin[i-1])+dmin[i-1]-x; 
            }
            else if(x>dmax[i-1])
            {
                dmin[i]=max(0,x-total+2*s-dmax[i-1]);
            }
            else
            {
                dmin[i]=max(0,2*s-total);
            }
            if(s-x<dmin[i-1])
            {
                dmax[i]=s-x+min(s-dmin[i-1],x);
            }
            else if(s-x>dmax[i-1])
            {
                dmax[i]=min(x+dmax[i-1],s);
            }
            else
            {
                dmax[i]=s;
            }
        }
        int x=max(r[n-1],l[0]);
        if(dmin[n-1]+x>s)
        {
            total=total+dmin[n-1]+x-s;
        }
    cout<<total<<"\n";
    }
   // fclose(stdin);
   // fclose(stdout); 
    return 0;
}

令x=max(r[i-1],l[i]), 然后total=s+max(x)。 用dmin[i]记录第i个餐馆和第一个餐馆相同的菜的最小值,dmax[i]是最大值,然后递推出dmin[n-1] 比较 dmin[n-1]+x-s的大小,添加到结果中。

递推在源代码里。

{{{

#include

#include

#include

using namespace std;

void SAISEI(int n, int m, int t1, int t2, int L[], int R[])

{

srand(t1);

for (int i = 0; i < n; i++)

L[i] = rand() % m;

srand(t2);

for (int i = 0; i < n; i++)

R[i] = rand() % m;

}

int main()

{

//freopen("in","r",stdin);

//freopen("out","w",stdout);

int n,s,t1,t2,m;

while(cin>>n>>s>>t1>>t2>>m)

{

int l[200001];

int r[200001];

int dmin[200001];

int dmax[200001];

SAISEI(n,m,t1,t2,l,r);

int flag=0;

dmin[0]=s;

dmax[0]=s;

int total=0;

for(int i=0;i

{

if(s

{

cout<<"AHOU\n";

flag=1;

break;

}

total=max(total,s+max(r[i],l[(i+1)%n]));

}

if(flag==1)

continue;

for(int i=1;i

{

int x=max(r[i-1],l[i]);

if(x

{

dmin[i]=max(0,x-total+2*s-dmin[i-1])+dmin[i-1]-x;

}

else if(x>dmax[i-1])

{

dmin[i]=max(0,x-total+2*s-dmax[i-1]);

}

else

{

dmin[i]=max(0,2*s-total);

}

if(s-x

{

dmax[i]=s-x+min(s-dmin[i-1],x);

}

else if(s-x>dmax[i-1])

{

dmax[i]=min(x+dmax[i-1],s);

}

else

{

dmax[i]=s;

}

}

int x=max(r[n-1],l[0]);

if(dmin[n-1]+x>s)

{

total=total+dmin[n-1]+x-s;

}

cout<

}

// fclose(stdin);

// fclose(stdout);

return 0;

}