题意:一个切水果游戏。每秒出现一些水果,它们都在一条线上,有好水果和坏水果,好的可以加分,坏的减分,每次连续切好水果三个以上可以分数加倍。每秒只能切一次,每切一次要间隔m秒。问最多得多少分。

思路:对于每一秒的时候,可以确定连续的好水果一定会一起切,可以合并。然后用最大连续数组和求解该秒可得最优解。然后再所有的时间内进行简单动规就行了。

#include <bits/stdc++.h>  
using namespace std;  
struct Fruit  
{  
    int t,good,p,vis,val;  
    Fruit(int a=0,int b=0,int c=0,int d=1,int e=1):t(a),good(b),p(c),vis(d),val(e)  
    {  
        if(b==0) val=1;  
        else val=-1;  
    }  
    bool operator < (const Fruit &rhs) const  
    {  
        return p<rhs.p;  
    }  
};  
const int maxn=10005;  
vector<Fruit> vec[maxn];  
void init(int n)  
{  
    for(int i=1; i<=n; ++i)  
        vec[i].clear();  
}  
int val[maxn];  
int dp[maxn];  
int bestS(const vector<Fruit> &v)  
{  
    int ans=0;  
    int sum=0;  
    for(int i=0; i<v.size(); ++i)  
    {  
        if(sum<0) sum=v[i].val;  
        else sum+=v[i].val;  
        ans=max(ans,sum);  
    }  
    return ans;  
}  
int main()  
{  
    int T,kase=0;  
    scanf("%d",&T);  
    while(T--)  
    {  
        int n,m;  
        scanf("%d%d",&n,&m);  
        int maxt=0;  
        for(int i=1; i<=n; ++i)  
        {  
            int a,b,c;  
            scanf("%d%d%d",&a,&b,&c);  
            vec[a].push_back(Fruit(a,b,c));  
            maxt=max(maxt,a);  
        }  
        for(int i=1; i<=maxt; ++i)  
            sort(vec[i].begin(),vec[i].end());  
        for(int i=1; i<=maxt; ++i)  
        {  
            vector<Fruit> v;  
            for(int j=0; j<vec[i].size(); ++j)  
            {  
                if(v.empty()) v.push_back(vec[i][j]);  
                else  
                {  
                    int sz=v.size()-1;  
                    if(v[sz].good==0&&vec[i][j].good==0)  
                    {  
                        v[sz].vis++;  
                        if(v[sz].vis==2) v[sz].val++;  
                        else if(v[sz].vis==3) v[sz].val=v[sz].val*2+2;  
                        else v[sz].val+=2;  
                    }  
                    else  
                        v.push_back(vec[i][j]);  
                }  
            }  
            val[i]=bestS(v);  
        }  
        for(int i=1; i<=maxt; ++i)  
        {  
            int last=0;  
            if(i-m-1>=1) last=dp[i-m-1];  
            dp[i]=max(dp[i-1],val[i]+last);  
        }  
        printf("Case %d: %d\n",++kase,dp[maxt]);  
        init(maxt);  
    }  
    return 0;  
}  
   


GitHub 加速计划 / ni / ninja
4
0
下载
a small build system with a focus on speed
最近提交(Master分支:3 个月前 )
dcefb838 Fix typo: Explaantions -> Explanations 6 个月前
2f19d3a0 - 6 个月前
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐