• 杀蚂蚁


    啊对,你们没看错,我做了杀蚂蚁,就是辣个大模拟!

    好吧,实际上只是一道同名的(DP)而已。。。

    稍微有一些分析。

    先放个链接免得你们说我钓鱼

    通过观察题面,我们显然得知,先放放射塔和干扰塔是更优的,因此我们将问题转化为了如何在前面放置放射与干扰,在最后放激光使得伤害最高。

    我们设(f[i][j])表示前(i)个塔只放放射与干扰,后(n-i)个塔放激光时,前(i)个塔中有(j)个干扰的答案。

    因为这里是一只鸽子在写文章,所以就不放方程了。

    显然这个方程很好推不是吗?

    然而这一题要开会爆(long) (long),然后我们就。。。开(int128)跑路。

    #include<bits/stdc++.h>
    using namespace std;
    #define int __int128
    inline int read()
    {
        int f=1,w=0;char x=0;
        while(x<'0'||x>'9') {if(x=='-') f=-1; x=getchar();}
        while(x!=EOF&&x>='0'&&x<='9') {w=(w<<3)+(w<<1)+(x^48);x=getchar();}
        return w*f;
    }
    const int N=5200;
    int n,T,r,b,g,ans,f[N][N];
    inline void print(int x)
    {
        if(!x) {puts("0");return;}  
        string S="";while(x) S+=x%10+'0',x/=10;
        reverse(S.begin(),S.end());cout<<S;
    }
    signed main(){
    #ifndef ONLINE_JUDGE
        freopen("A.in","r",stdin);
    #endif
    	n=read(),r=read(),g=read(),b=read(),T=read();
    	for(int i=1;i<=n;i++) f[i][0]=f[i-1][0]+T*g*(i-1);
    	for(int i=1;i<=n;i++)
    		for(int j=1;j<i;j++)
    			f[i][j]=max(f[i-1][j]+(T+j*b)*g*(i-1-j),f[i-1][j-1]+(T+(j-1)*b)*g*(i-j));
    	for(int i=0;i<=n;i++)
    		for(int j=0;j<=i;j++)
    			ans=max(ans,f[i][j]+(n-i)*r*(T+j*b)+(i-j)*g*(T+j*b)*(n-i));
    	print(ans);
    }
    
  • 相关阅读:
    .net 面试题之 输出 空 三角型
    js 里 用XML httpRequest 调用 Web Service
    C# 设计模式之 单例模式
    C#TreeView 实现无线级别分类
    asp.net Session的原理
    .Net 面试题之 查询两个时间差
    暑 假 队 测 Round #2
    两个排序算法的扩展应用
    暑 假 队 测 Round #1
    二维单调队列或st表
  • 原文地址:https://www.cnblogs.com/wo-shi-zhen-de-cai/p/11798285.html
Copyright © 2020-2023  润新知