首页 > 其他分享 >uva

uva

时间:2022-10-31 10:57:51浏览次数:45  
标签:int 施工队 uva include 位点 id cmp

数轴上有 nn 个施工队 a[1…n],m 个受损的防御位点 b[1…m],

每个施工队都要进入一个防御位点,而且每个防御位点都要有人进入,问施工队最少需要移动多少距离。

 

先排序

队伍i,防御点j

 f[i][j] =min( f[i-1][j] ,f[i-1][j-1] ) +dis(i,j)

 

 

#include <iostream>
#include <cmath>
#include <algorithm>
using namespace std ;
 const int N=4005;
 
 #define int long long
 
  const int inf=1e18;
 struct T{
     int id,v;
 };
 int cmp(T a,T b){
     return a.v<b.v;
 }
 T a[N],b[N];
 int f[N][N],n,m;
 int r[N][N],ans[N];
  
 void print(int x,int y){
     if(x==0&&y==0) return;
     
     ans[a[x].id]=b[y].id;
     if(r[x][y]) print(x-1,y-1); else print(x-1,y);
 }
 signed main(){
     //freopen("in","r",stdin);
     while(cin>>n){
     int i,j;
     for(i=1;i<=n;i++) cin>>a[i].v,a[i].id=i;
     cin>>m;
     for(i=1;i<=m;i++) cin>>b[i].v,b[i].id=i;
     sort(a+1,a+1+n,cmp);
     sort(b+1,b+1+m,cmp);
     
     for(j=1;j<=m;j++) f[0][j]=inf;  
    f[0][0]=0;
     
     for(i=1;i<=n;i++){
     for(j=0;j<=m;j++) f[i][j]=inf; 
      
      for(j=1;j<=min(i,m);j++){
          int t=abs(a[i].v-b[j].v);
          if(f[i-1][j-1]<=f[i-1][j]){
              f[i][j]=f[i-1][j-1]+t;
              r[i][j]=1;
          }
          else{
              f[i][j]=f[i-1][j]+t;
              r[i][j]=0;
          }
      }
    }
    cout<<f[n][m]<<endl;
    print(n,m);
    for(i=1;i<n;i++) cout<<ans[i]<<' ';
    cout<<ans[n];
    cout<<endl;
    }
    
 }
 
 
 

 

标签:int,施工队,uva,include,位点,id,cmp
From: https://www.cnblogs.com/towboa/p/16843551.html

相关文章

  • UVA12003 Array Transformer(分块,块内二分)
    我们考虑用分块来水过此题我们先将原序列进行分块,对于某个块\(B\)内的数,我们把它们放进一个数组\(block[B][\]\)里,再对数组进行排序。那么我们就得到了\(\sqrt{n}\)......
  • UVA11297 Census(kd-tree)
    题意:给定一个\(n\timesn\)的网格,要求支持修改和询问某个矩阵的最大值和最小值。解法多样,可以用二维线段树,我用的是\(kd-tree\)。那么这题就很裸了,我在这里只提几点需......
  • UVA10384 推门游戏 The Wall Pushers(IDA_,A_)
    题目大意给你一个\(4\times6\)的网格图,网格边缘上可能有墙。对于每一个网格有一个权值\(val\),其中\[\begin{aligned}val=&&1(\text{如果这个网格左边缘(西边缘)有墙......
  • uva 590
    一共有n座城市,要在这n座城市旅游k天,从城市1出发,第k天到达城市n。输入有n*(n-1)行,每n-1行代表i到除了i之外的其他城市航班的天数以及价格。求最小花费。  #include......
  • uva 473
    有n首歌,每首时长Ti,要把这n首歌装进m个光盘里面,每个光盘最多能存的时长为t. 要求这些歌在光盘里面要按照所给歌的先后顺序存入,不能改变前后顺序. 例如有4首歌,按顺序......
  • uva 442
    矩阵连乘用栈处理表达式((AB)C)#include<iostream>#include<cstdio>#include<string>#include<stack>usingnamespacestd;structM{inta,b;......
  • uva 10453
    将字符串变为回文串最少需要几次操作(在任意位置插入字符),并输出变化后的回文串f[l][r]=f[l+1][r-1]//a[i]==a[j]=min(f[l+1][r],f[l][r-1])#include<iostre......
  • uva 10163
    n个仓库,安排m个人看守,每个仓库只由一个人看守,每个人对应a[i],表示能量(薪水)如果某个人看守k个仓库,每个仓库能量值a[i]/k求仓库能量最小值最大时,所支付薪水最少值  ......
  • uva 1291
    游戏者必须按照这个序列一次用某一只脚踩相应的踏板。在任何时候,两只脚不能在同一个踏板上,但可以同时在中心位置0。每一个时刻,HH必须移动他的一只脚去踩相应的箭头,另一只脚......
  • uva 11795
      题目意思还是有点绕的,想了好一会大体上是一个状压dp(废话 f[j],当当前拥有武器集合为j时,消灭所有怪物的方案数像线性dp一样,但可以去掉一维 f[j]+=f[t],t=j^(1......