zoukankan      html  css  js  c++  java
  • bzoj 3928: [Cerc2014] Outer space invaders

    $f[i][j]$表示消灭起始时间在$(i,j)$内的外星人所花费的最小代价。

    考虑在这个区间内距离最远的外星人h,在他的区间中一定要选一个点要开一炮,而且这一炮可以顺便把其他跨过这个点的敌人消灭,剩下只需消灭没有跨过这个点的敌人。

    枚举开炮时间$f[i][j]=min(f[i][k]+f[k][j]+d[h])$.

    区间需要离散化。

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #define N 605
    using namespace std;
    int n;
    int li[N],cnt;
    int a[N],b[N],d[N];
    int f[N][N];
    int main()
    {
    	int cas;
    	scanf("%d",&cas);
    	while(cas--)
    	{
    		scanf("%d",&n);cnt=0;
    		for(int i=1;i<=n;i++)
    		{
    			scanf("%d%d%d",&a[i],&b[i],&d[i]);
    			li[++cnt]=a[i];li[++cnt]=b[i];
    		}
    		sort(li+1,li+cnt+1);
    		cnt=unique(li+1,li+cnt+1)-li-1;
    		for(int i=1;i<=n;i++)
    		{
    			a[i]=lower_bound(li+1,li+cnt+1,a[i])-li;
    			b[i]=lower_bound(li+1,li+cnt+1,b[i])-li;
    		}
    		cnt++;
    		for(int l=0;l<=cnt;l++)
    		{
    			for(int i=0;i<=cnt-l;i++)
    			{
    				int j=i+l;int h=-1;
    				for(int k=1;k<=n;k++)
    				{
    					if(a[k]>i&&b[k]<j)
    					{
    						if(h==-1||d[k]>d[h])h=k;
    					}
    				}
    				if(h==-1)f[i][j]=0;
    				else
    				{
    					f[i][j]=0x3f3f3f3f;
    					for(int k=a[h];k<=b[h];k++)
    					{
    						f[i][j]=min(f[i][j],f[i][k]+f[k][j]+d[h]);
    					}
    				}
    			}
    		}
    		printf("%d
    ",f[0][cnt]);
    	}
    	return 0;
    }
    

      

  • 相关阅读:
    read
    df,du,mount
    cat,tac,more
    Makefile内嵌函数
    PHP常量详解:define和const的区别
    微信小程序之this.setData
    二维码支付原理分析及安全性的探究
    php 原生文件下载
    php原生实现图片上传和查看
    php文件的处理和操作
  • 原文地址:https://www.cnblogs.com/ezyzy/p/6659204.html
Copyright © 2011-2022 走看看