TYVJ1064 新三国争霸

描述

PP 特别喜欢玩即时战略类游戏,但他觉得那些游戏都有美中不足的地方。灾害总不降临道路,而只降临城市,而且道路不能被占领,没有保护粮草的真实性。于是他就研发了《新三国争霸》。
在这款游戏中,加入灾害对道路的影响(也就是一旦道路W[i,j]受到了灾害的影响,那么在一定时间内,这条路将不能通过)和道路的占领权(对于一条道路W[i,j],至少需要K[i,j]个士兵才能守住)。
PP可真是高手,不一会,就攻下了N-1座城市,加上原来的就有N座城市了,但他忽略了一点……那就是防守同样重要,不过现在还来的及。因为才打完仗所以很多城市都需要建设,PP估算了一下,大概需要T天。他现在无暇分身进攻了,只好在这T天内好好的搞建设了。所以他秒要派士兵占领一些道路,以确保任何两个城市之间都有路(不然敌人就要分而攻之了,是很危险的)。士兵可不是白干活的,每个士兵每天都要吃掉V的军粮。因为有灾害,所以方案可能有变化(每改变一次就需要K的军粮,初始方案也需要K的军粮)。
因为游戏是PP编的,所以他知道什么时候有灾害。PP可是一个很节约的人,他希望这T天在道路的防守上花最少的军粮。
N<=300,M<=5000 ,T<=50。

思路:看到题,表示吓到了,一开始没有读懂,连样例都不知道怎么出来的。后来同组的dada以飞速ac,于是就向他求救了。大神就是大神,把边的信息存下来,用了个二维、三维的数组,然后就是dp部分了,穷举每一次不变安排的开始和终结点,注意j(起点)要从i-1到0,因为要对边的取得情况进行判断,用了flag数组和||运算。然后就是最小生成树求边权和的问题了,用的并查集的做法,很简单就能的出tt,最后f(i)=min(f(i),f(j)+tt*(i-j)*v+k)。

code:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
struct uses{
 int st,en,va;
}tree[10000];
int road[500][500]={0},f[100],n,fa[500];
bool cn[500][500][100]={false},flag[500][500]={false};
int my_comp(const uses &x,const uses &y)
{
 if (x.va<y.va) return 1;
 return 0;
}
int root(int x)
{
 if (fa[x]!=x) fa[x]=root(fa[x]);
 return fa[x];
}
int main()
{
 int sum,m,t,v,k,i,j,a,b,c,x,y,t1,t2,p,tot=0,ans,r2,r1;
 cin>>n>>m>>t>>v>>k;
 memset(f,127,sizeof(f));
 for (i=1;i<=m;++i)
 {
  cin>>a>>b>>c;
  if (a>n||b>n) continue;
  road[a][b]=road[b][a]=c;
 }
 cin>>p;
 for (i=1;i<=p;++i)
 {
  cin>>x>>y>>t1>>t2;
  if (road[x][y]==0) continue;
  if (t1>t2) 
  {
   a=t1;t1=t2;t2=a;
  }
  if (t1>t) continue;
  if (t2>t) t2=t;
  for (j=t1;j<=t2;++j)
    cn[x][y][j]=cn[y][x][j]=true;
 }
 f[0]=0;tot=0;
 for (i=1;i<n;++i)
   for (j=i+1;j<=n;++j)
     if (road[i][j]>0)
     {
     ++tot;
     tree[tot].st=i;
     tree[tot].en=j;
     tree[tot].va=road[i][j];
    }
 sort(tree+1,tree+tot+1,my_comp);
 for (i=1;i<=t;++i)
 {
   memset(flag,false,sizeof(flag));
   for (j=i-1;j>=0;--j)
   {
    sum=1;
    ans=0;
    for (a=1;a<=n;++a)
      fa[a]=a;
  for (a=1;a<=tot;++a)
  {
    flag[tree[a].st][tree[a].en]=
      flag[tree[a].st][tree[a].en]||(cn[tree[a].st][tree[a].en][j+1]);
    if (!flag[tree[a].st][tree[a].en])
    {
   r1=root(tree[a].st);
      r2=root(tree[a].en);
      if (r1!=r2)
      { 
     fa[r1]=r2;
     ans=ans+tree[a].va;
     ++sum;
      } 
    }
    if (sum==n) break;
     }
     if (sum>=n)
  f[i]=min(f[i],f[j]+ans*(i-j)*v+k);
   }
    }
 cout<<f[t]<<endl;
}

时间: 2024-11-04 13:30:44

TYVJ1064 新三国争霸的相关文章

codevs1403 新三国争霸

题目描述 Description PP 特别喜欢玩即时战略类游戏,但他觉得那些游戏都有美中不足的地方.灾害总不降临道路,而只降临城市,而且道路不能被占领,没有保护粮草的真实性.于是他就研发了<新三国争霸>.在这款游戏中,加入灾害对道路的影响(也就是一旦道路W[i,j]受到了灾害的影响,那么在一定时间内,这条路将不能通过)和道路的占领权(对于一条道路W[i,j],至少需要K[i,j]个士兵才能守住).PP可真是高手,不一会,就攻下了N-1座城市,加上原来的就有N座城市了,但他忽略了一点……那就是

[Codevs1403]新三国争霸(MST+DP)

题目:http://codevs.cn/problem/1403/ 分析: 很容易想到对于某个确定的一天,就是求个最小生成树,又因为数据范围很小,所以可以暴力.但问题的关键是如果相邻两天的方案不同,就要多付钱.这个问题很像bzoj1003. 考虑DP 设w[i][j]表示i~j天不换方案的最小花费,f[i]表示前i天总的最小花费,于是就枚举改变方案在哪一天 f[i]=min(f[i],f[j]+k+w[j+1][i]*v*(i-j))

codevs 1403 新三国争霸

用dp[i]表示第i天的最少花费 cost[i][j]表示从i到j天方案不变时的士兵数 用双层循环+kruskal预处理出cost[i][j] P[u][v][t]表示u到v的路在t时间是否可用 (即灾害) 按照时间轴进行dp,外层循环i,内层循环j表示它的方案从第j天转移而来 dp[i]=min(dp[i],dp[j]+cost[j+1][i]*V*(i-j)); 即从第j天改变方案,选择最小合法方案后,一直到第i天 初始化dp[i]=cost[1][i]*i*V; //注意cost[1][i

7、8月刷题总结

准备开学了囧,7.8月刷题记录,以后好来复习,并且还要好好总结! 数据结构: splay: [BZOJ]1503: [NOI2004]郁闷的出纳员(Splay) [BZOJ]1269: [AHOI2006]文本编辑器editor(Splay) [BZOJ]1507: [NOI2003]Editor(Splay) treap: [BZOJ]1862: [Zjoi2006]GameZ游戏排名系统 & 1056: [HAOI2008]排名系统(treap+非常小心) [BZOJ]3224: Tyvj

大神刷题表

9月27日 后缀数组:[wikioi3160]最长公共子串 dp:NOIP2001统计单词个数 后缀自动机:[spoj1812]Longest Common Substring II [wikioi3160]最长公共子串 [spoj7258]Lexicographical Substring Search 扫描线+set:[poj2932]Coneology 扫描线+set+树上删边游戏:[FJOI2013]圆形游戏 结论:[bzoj3706][FJ2014集训]反色刷 最小环:[poj1734

小结:动态规划

概要: 状态.转移:最优子结构.无后效性. 技巧及注意: dp就是纯经验+智商题 在dp方程写出来后,一定要考虑边界!不要以为转移对了就行了! 滚动数组的话一定要考虑好顺序! 下标有时候可以灵活使用!比如mod意义下的dp,倍数什么.可到达性等题目都可以这样做. 如果是线性序列的max{f[k]},k<i这种可以用线段树或bit维护成log 注意“前i”和“第i”的区别(特别对于答案更新),有时换一种就能解答出问题. 在状态加限制条件,如单调.地址等. 用下标来维护下标这个答案是否可达. 博弈论

【文学文娱】斗胆聊聊那《三国》

本文地址:http://www.cnblogs.com/aiweixiao/p/6985398.html 原文地址(微信):http://t.cn/RSmz9xs 点击关注微信公众号 三国·滚滚长江东逝水 这里说的<三国>,主要指的就是明朝罗贯中老先生的<三国演义>,当然出名的还有新旧两部<三国演义>的电视剧.我都很喜欢.<三国>的故事家喻户晓,里面的学问也是大了去了,文臣武将,兵法韬略,那个拿出来都能说上半天.大家也都有自己心目中的三国和三国英雄及故事.我

手机CPU

说起手机CPU的历史,笔者给大家提一个问题:"世界上第一款智能手机是什么呢?"相信很多人的答案是爱立信的R380或诺基亚的7650,但都不对,真正的首款智能手机是由摩托罗拉在2000年生产的名为天拓A6188的手机,它是全球第一部具有触摸屏的PDA手机,它同时也是第一部中文手写识别输入的手机,但最重要的是A6188采用了摩托罗拉公司自主研发的龙珠(Dragon ball EZ)16MHzCPU,支持WAP1.1无线上网,采用了PPSM (Personal Portable System

CNCF官方大使张磊:什么是云原生?

作者|张磊 阿里云容器平台高级技术专家,CNCF 官方大使 编者说: 从 2015 年 Google 牵头成立 CNCF 以来,云原生技术开始进入公众的视线并取得快速的发展,到 2018 年包括 Google.AWS.Azure.Alibaba Cloud 等大型云计算供应商都加入了云原生基金会?CNCF,云原生技术也从原来的应用容器化发展出包括容器.Service Mesh.微服务.不可变基础设施.Serverless.FaaS 等众多技术方向,CFCF 旗下也囊括了越来多的开源项目. Kub