(CCF CAT 训练二)2023-2024年中国计算机应用技术大赛- 全国算法精英大赛

Flower
在这里插入图片描述

反悔贪心,按照时间对花朵进行排序,从0到n-1遍历花朵,如果当前堆中元素小于当前花朵的绽放时间t,直接放入堆中,否则花朵金币数放入堆中并弹出堆中金币数最小值,最后如果堆中元素个数大于k,一直弹出堆中最小金币数直到元素个数等于k

#include <iostream>
#include <queue>
#include <vector>
#include <algorithm>
using namespace std;
const int N=1e5+5;
int t[N], w[N];

int main()
{
   
  int n, k;
  cin>>n>>k;
  for(int i=0;i<n;i++){
   
    cin>>t[i];
  }
  for(int i=0;i<n;i++){
   
    cin>>w[i];
  }
  vector<pair<int,int>> v;
  for(int i=0;i<n;i++){
   
      v.push_back({
   t[i], w[i]});
  }
  priority_queue<int, vector<int>, greater<int>> pq;
  sort(v.begin(), v.end(), [](const pair<int,int>& p1, const pair<int,int>&p2){
   
      return p1.first < p2.first;
  });
  int ans = 0;
  for(int i=0;i<n;i++){
   
      if(v[i].first > int(pq.size())){
   
          pq.push(v[i].second);
          ans+=v[i].second;
      }else{
   
          ans+=v[i].second - pq.top();
          pq.push(v[i].second);
          pq.pop();
      }
    //   if(pq.size())
  }
//   cout<<pq.size()<<" ";
  while(int(pq.size()) > k){
   
      ans-=pq.top();
      pq.pop();
  }
  cout<<ans;
}

Tree
在这里插入图片描述

先构造二叉搜索树,询问的时候再进行递归求节点深度

#include <iostream>
#include <queue>
#include <vector>
#include <algorithm>
using namespace std;

struct node{
   
  node* l = nullptr,*r = nullptr;
  int v;
  node(int v1):v(v1){
   }
};
node* root = nullptr;
void insert(int i){
   
    if(root==nullptr){
   
        root = new node(i);
    }else{
   
        node* pre = root;
        node* tmp = root->v>i? root->l:root->r;
        while(tmp!=nullptr){
   
            pre = tmp;
            tmp = tmp->v>i? tmp->l:tmp->r;
        }
        tmp = new node(i);
        if(pre->v > i){
   
            pre->l = tmp;
        }else{
   
            pre->r = tmp;
        }
    }
}
int find(int i){
   
    node* tmp = root;
    int deep = 1;
    while(tmp!=nullptr){
   
        tmp = tmp->v>i? tmp->l:tmp->r;
        deep++;
    }
    return deep;
}
int main()
{
   
  int n;
  cin>>n;
  for(int i=0;i<n;i++){
   
      int a;
      cin>>a;
      insert(a);
  }
  for(int i=0;i<n;i++){
   
      int a;
      cin>>a;
      cout<<find(a)<<endl;
  }

}


Best Travel Plans

在这里插入图片描述

使用动态规划, 遍历1到n座城市,dp[i][j]表示到达第i座城市且花费j时间的最大旅行活动数
转移方程 d p [ i ] [ j ] = m a x ( d p [ i ] [ j ] , d p [ i − 1 ] [ k ] + 在第 i 座城市花费 j − k − t [ i ] 获得旅行活动数 ) dp[i][j] = max(dp[i][j], dp[i-1][k] +在第i座城市花费j-k-t[i]获得旅行活动数) dp[i][j]=max(dp[i][j],dp[i1][k]+在第i座城市花费jkt[i]获得旅行活动数)
这里代码超时了,还没想好优化思路,后面有时间再补上
用枚举加贪心,枚举前 i i i个城市, 除去旅行时间,剩下remain时间,遍历前 i i i个城市,每次选择最大活动数量,时间复杂度 O ( n 2 m ) O(n^2m) O(n2m) 代码如下

//动态规划超时
#include <iostream>
#include <queue>
#include <vector>
#include<cstring>
#
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

qq_43983809

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值