您的位置:首页 > 其它

codeforces#291(div.2)D题

2015-02-15 11:40 218 查看
仔细想想还是比较简单的。

dp[i]表示能破坏以i号机器人结尾的连续最长序列的长度。

dp[i]=dp[i-1]+1,当sum<=k;(加上i号机器人用的导弹数不会超过k);

否则dp[i]=1,当i号机器人用的导弹数不超过k,然后再往前去加机器人,如果加上i-1号机器人用的导弹数不会超过k,那么dp[i]++;以此往前推,直到不能加为止;

否则dp[i]=0,当i号机器人用的导弹数就超过了k。

下面是代码:

#include<iostream>

#include<cstring>

using namespace std;

int dp[100005];//能破坏以i号机器人结尾的连续最长序列的长度。

int a[100005][6];

int s[100005];//每个机器人细节总和;

int maxx[100005][6];

int main()

{

    memset(s,0,sizeof(s));

    int n,m,k,ans=0,maxn=0;

    cin>>n>>m>>k;

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

        for(int j=0;j<m;++j){

            cin>>a[i][j];

            s[i]+=a[i][j];

        }
    }

    if(s[0]<=k){

        dp[0]=1;

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

            maxx[0][i]=a[0][i];

    }

    else {

        dp[0]=0;

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

            maxx[0][i]=0;
    }

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

    {

        int sum=0;

        for(int j=0;j<m;++j)

        {

            maxx[i][j]=max(maxx[i-1][j],a[i][j]);

            sum+=maxx[i][j];

        }

        if(sum<=k)dp[i]=dp[i-1]+1;

        else{

            if(s[i]<=k){

                dp[i]=1;

                for(int j=0;j<m;++j)

                    maxx[i][j]=a[i][j];

                for(int I=i-1;I>=0;I--)

                {

                    sum=0;

                    for(int j=0;j<m;++j)

                    {

                        sum+=max(maxx[i][j],a[I][j]);

                    }

                    if(sum<=k){

                        dp[i]++;

                        for(int j=0;j<m;++j)

                        {

                            maxx[i][j]=max(maxx[i][j],a[I][j]);

                        }

                    }

                    else{

                        break;

                    }

                }

            }

            else {

                dp[i]=0;

                for(int j=0;j<m;++j)

                    maxx[i][j]=0;

            }

        }

        if(dp[i]>=maxn){

            ans=i;

            maxn=dp[i];

        }

    }

    for(int j=0;j<m;++j){

        if(j==0)

        cout<<maxx[ans][j];

        else

        cout<<' '<<maxx[ans][j];

    }

    cout<<endl;

    return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: