当前位置: 首页 > news >正文

1056. Mice and Rice (25)-PAT甲级真题

当时没想到可以用队列来做,就傻傻的模拟了,用cur存当前轮的id,这个id对应的是order的下标,这里有个求rank的技巧就是当前轮没有晋级的rank为(当前轮的组数+1)

模拟:

#include<bits/stdc++.h>
using namespace std;
struct node{int id,w,rk=0;
};
vector<node> vec;
vector<int> order,cur; //cur用来记录当前晋级的组里面的id,对应order数组的下标
int np,ng;
bool cmp(node&a, node& b){return a.rk>b.rk;
}
int main(){scanf("%d%d",&np,&ng);vec.resize(np);order.resize(np);cur.resize(np);for(int i=0;i<np;i++){scanf("%d",&vec[i].w);vec[i].id=i;cur[i]=i;}for(int i=0;i<np;i++)scanf("%d",&order[i]);if(cur.size()==1){printf("1");return 0;}while(cur.size()>1){int start=0;vector<int> temp;int numg; //当前分组数if(cur.size()%ng!=0) numg=cur.size()/ng+1;else numg=cur.size()/ng;while(start<cur.size()){int max=-1,maxi=0;for(int i=start;i<start+ng&&i<cur.size();i++){vec[order[cur[i]]].rk=numg+1;if(max<vec[order[cur[i]]].w){max=vec[order[cur[i]]].w;maxi=i;}}vec[order[cur[maxi]]].rk=numg==1?1:numg+1;temp.push_back(cur[maxi]);start+=ng;}cur=temp;}sort(vec.begin(),vec.end(),[](node& a,node& b){return a.id<b.id;});for(int i=0;i<vec.size();i++)printf(i==0?"%d":" %d",vec[i].rk);return 0;
}

柳神的队列做法:

#include <iostream>
#include <queue>
#include <vector>
#include <algorithm>
using namespace std;
struct node {int weight, index, rank, index0;
};
bool cmp1(node a, node b) {return a.index0 < b.index0;
}
int main() {int n, g, num;scanf("%d%d", &n, &g);vector<int> v(n);vector<node> w(n);for(int i = 0; i < n; i++)scanf("%d", &v[i]);for(int i = 0; i < n; i++) {scanf("%d", &num);w[i].weight = v[num];w[i].index = i;w[i].index0 = num;}queue<node> q;for(int i = 0; i < n; i++)q.push(w[i]);while(!q.empty()) {int size = q.size();if(size == 1) {node temp = q.front();w[temp.index].rank = 1;break;}int group = size / g;if(size % g != 0)group += 1;node maxnode;int maxn = -1, cnt = 0;for(int i = 0; i < size; i++) {node temp = q.front();w[temp.index].rank = group + 1;q.pop();cnt++;if(temp.weight > maxn) {maxn = temp.weight;maxnode = temp;}if(cnt == g || i == size - 1) {cnt = 0;maxn = -1;q.push(maxnode);}}}sort(w.begin(), w.end(), cmp1);for(int i = 0; i < n; i++) {if(i != 0) printf(" ");printf("%d", w[i].rank);}return 0;
}

http://www.lryc.cn/news/420429.html

相关文章:

  • 色轮在数据可视化中的应用
  • 编程-设计模式 8:组合模式
  • c语言指针(8.11)
  • 加密技术的发展
  • 编程-设计模式 22:策略模式
  • kafka 将log4j的项目升级到log4j2
  • 【CSP2019 模拟赛】Time
  • 二叉树相关的算法题
  • Unity URP 曲面细分学习笔记
  • 每天五分钟深度学习pytorch:训练神经网络模型的基本步骤
  • 【langchain学习】使用缓存优化langchain中的LLM调用性能:内存、SQLite与Redis的对比
  • spring boot 集成EasyExcel
  • 获取对象中第一个存在的值
  • Python学习笔记----集合与字典
  • c# 排序、强转枚举
  • “华为杯”第十六届中国研究生数学建模竞赛-C题:视觉情报信息分析
  • html+css+js网页设计 找法网2个页面(带js)ui还原度百分之90
  • 018 | backtrader回测反转策略
  • 《图解HTTP》全篇目录
  • 基于VS2019(Release_x64)+Qt的软件开发—环境配置
  • 【书生大模型实战营(暑假场)闯关材料】入门岛:第1关 Linux 基础知识
  • 240810-Gradio通过HTML组件打开本地文件+防止网页跳转到about:blank
  • go在linux上安装
  • 算法日记day 35(动归之分割等和子集|最后一块石头的重量2)
  • FPGA使用sv生成虚拟单音数据
  • Linux shell编程:监控进程CPU使用率并使用 perf 抓取高CPU进程信息
  • Linux网络编程的套接字分析(其一,基本知识)
  • 后端Web开发之Maven
  • 前端创新实践:用JavaScript打造网页扫码新体验
  • AWS CLI命令行