那个序列

112 篇文章 0 订阅

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
⼆分 c[i]=mid>b[i]
Check ⼀下 c 剩下的和 b 剩下的,能不能达到 f(c,b)-1
⼆分 c[i]=mid<=b[i]
Check ⼀下 c 剩下的和 b 剩下的,能不能达到 f(c,b)
考虑( b[i+1…n] 和剩下的 n-i+1个 a) 的最⼤的 f 值为 p
排序后,肯定是 a 的最⼤的 p 个匹配 b 最⼩的 p 个
考虑我们要选的 a 在不在这个 p 个⾥,如果在且是第 k ⼤的话
那么 a 的第 k+1…p+1 要匹配 b 对应的那⼏个

#include<bits/stdc++.h>
#define mp make_pair
#define pb push_back
#define fi first
#define se second
#define IL inline
using namespace std;
typedef long long LL;
typedef unsigned int U;
typedef unsigned long long LLU;
typedef pair<int,int> PII;
typedef long double LD;
IL LL read()
{
 LL x=0,f=1;char ch=getchar();
 while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
 while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
 return x*f;
}
#define io read()
const int N=8008;
int n;
int a[N],b[N],c[N];
int ans[N];
int tmp;
IL bool ok(int num)
{
 for(int i=1;i<=num;++i)
 {
  if(b[i]>=a[n-num+i]) 
   return 0;
 }
 return 1;
}
IL void get_tmp()
{
 int l=0,r=n,mid;
 tmp=0;
 while(l<=r)
 {
  mid=(l+r)>>1;
  if(ok(mid))
  {
   tmp=mid;
   l=mid+1;
  }
  else
  {
   r=mid-1;
  }
 }
}
bool visa[N],visb[N];
int qa[N],qb[N],ta,tb;
IL void work()
{
 for(int i=1;i<=n;++i)
 {
  for(int j=1;j<=n;++j)
  {
   if(b[j]==c[i]&&!visb[j])
   {
    visb[j]=1;
    break;
   }
  }
  ta=tb=0;
  for(int j=1;j<=n;++j){
   
   if(visa[j]) 
    continue;
   qa[++ta]=j;
  }
  for(int j=1;j<=n;++j)
  {
   if(visb[j]) 
    continue;
   qb[++tb]=j;
  }
  int p;
  if(tmp>0)
  {
   p=ta-tmp+1;
   while(p<ta&&a[qa[p]]>b[qb[p-ta+tmp]])
   {
    ++p;
   }
   if(a[qa[p]]>c[i])
   {
    ans[i]=a[qa[p]];
    visa[qa[p]]=1;
    --tmp;
    continue;
   }
  }
  p=ta-tmp;
  while(p<ta&&a[qa[p]]>b[qb[p-ta+tmp+1]])
  {
   ++p;
  }
  ans[i]=a[qa[p]];
  visa[qa[p]]=1;
 }
 for(int i=1;i<=n;++i)
 {
  printf("%d ",ans[i]);
 }
}
int main()
{
 n=io;
 for(int i=1;i<=n;++i)
 {
  b[i]=io;
  c[i]=b[i];
 }
 for(int i=1;i<=n;++i)
 {
  a[i]=io;
 }
 sort(a+1,a+n+1);
 sort(b+1,b+n+1);
 get_tmp();
 work();
 return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Dijkstra算法是一种用于解决带权有向图或无向图的单源最短路径问题的贪心算法。在这个问题中,我们需要找到从顶点a到其他顶点的最短路径和对应的路径。 下图中,从顶点a到其他顶点的最短路径和对应的路径如下: a -> b: 2 (a -> c -> b) a -> c: 1 (a -> c) a -> d: 4 (a -> c -> d) a -> e: 3 (a -> c -> e) a -> f: 6 (a -> c -> e -> f) 可能的顶点收集顺序是:a, c, b, d, e, f。 注:这里的顶点收集顺序指的是在Dijkstra算法中,每次选择距离源点最近的未标记顶点作为下一个顶点。 ### 回答2: Dijkstra算法是一种求解带有非负权值的图中单源最短路径问题的贪心算法。它以起点为中心向外层层扩展,每次选择当前距离起点最近的一个顶点作为松弛点,更新它的邻居节点距离起点的最短路径值。直到最终求解出起点到各个顶点的最短路径。 在这道题目中,我们要用Dijkstra算法求解从顶点a到其他顶点的最短距离及对应的路径。根据题目中给出的图,我们可以用以下步骤求解: 1. 初始化:将所有顶点的最短路径dist[v]初始化为INF,起点a的最短路径dist[a]初始化为0。将所有顶点的前驱节点prev[v]初始化为NIL。 2. 建立一个空的集合S,用来存放已经确定最短路径的顶点。 3. 选取dist值最小的顶点u,将它加入到集合S中。 4. 对于u的每个邻居节点v,如果dist[u]+w(u,v)<dist[v],则更新dist[v]=dist[u]+w(u,v),prev[v]=u。 5. 重复执行步骤3和步骤4,直到集合S包含所有顶点。 根据上述步骤,我们可以得到从顶点a到每个顶点的最短路径如下表所示: 顶点 | 最短距离 | 最短路径 ---|---|--- a | 0 | a b | 10 | a -> d -> b c | 7 | a -> c d | 5 | a -> d e | 12 | a -> c -> e f | 16 | a -> c -> e -> f 因此,从顶点a到其他顶点的最短距离及对应的路径如上表所示。 对于可能的顶点收集顺序,根据Dijkstra算法的特点,每次选择距离起点最近的顶点进行松弛操作,因此顶点的收集顺序可能为acdbef或cadbfe。两种顺序都能够得到正确的最短路径结果。 ### 回答3: 本题给出一张图,需要利用Dijkstra算法求解从顶点a到其他顶点的最短路径和对应的路径。Dijkstra算法是一种求解单源最短路径的贪心算法,其根据当前未访问的节点中离起始节点最近的节点进行扩展,逐步得到最终结果。 对于给出的图,我们可以采用如下步骤进行Dijkstra算法求解: 1. 初始化:将所有节点的最短路径初始化为无穷大,起始节点a的最短路径初始化为0。将所有节点标记为未访问。 2. 选择节点:从未访问的节点中选择离起始节点最近的节点,并将其标记为已访问。 3. 更新邻接节点的最短路径:对于新选择的节点v,遍历其邻接节点,对于每个邻接节点u,如果通过节点v可以获得比当前路径更短的路径,则更新其最短路径和前驱节点为v。 4. 重复步骤2、3,直到所有节点都已被访问。 采用以上步骤,我们可以得到如下的最短路径表格: | 顶点 | 最短距离 | 路径 | |--------|--------|-------| | a | 0 | a | | b | 5 | a -> b | | c | 1 | a -> c | | d | 4 | a -> c -> d | | e | 6 | a -> b -> e | 根据最短路径表格可以得到从顶点a到其他顶点的最短路径以及对应的路径。例如,从顶点a到顶点d的最短路径长度为4,路径为a -> c -> d。从顶点a到顶点e的最短路径长度为6,路径为a -> b -> e。 对于给出的顶点收集顺序序列,我们需要验证其是否合法。经过验证,选择顺序为a、c、b、d、e是合法的,因为这个顺序满足了Dijkstra算法从起始节点开始,每次选择最近的未访问节点的原则。而其他选择顺序均不合法,因为它们违反了这个原则。例如,选择顺序为a、d、c、e、b违反了从最近节点开始遍历的规则,因为顺序中先选择了距离较远的d节点。因此,正确的顶点收集顺序是a、c、b、d、e。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值