老鼠爱大米的队列问题

你的小可爱又双叒叕来🦌!
这刺是一道英文题,自诩英文好的我,看得一头雾水,看来还是个蒟蒻,不善于阅读英文编程题呀~
来,题面——开!
算了,复制粘贴太不友好了,诺,传送门:1056 Mice and Rice
来看看我的菜鸡翻译:
菜鸡翻译
算了还是别看了,误导小盆友就不好了,看正经人是怎么翻译的吧!
我特喵?programmers=mice?这也太太太太太不友好了吧!
等等,我翻译的好像牛头不对鼠嘴。。呜呜呜此时一只蒟蒻枯了起来
来看看问题所在——

① Then every N​G
​​ programmers are grouped in a match. 每NG只老鼠被分在一组

而不是“每个NG程序员在一次匹配中组队”!天哪我的🦅🐟

②If there are less than NG
mice at the end of the player’s list, then all the mice left will be put into the last group. 最后不够NG的单独分在一组

而不是“如果最终在玩家榜单上的老鼠数少于NG,则所有老鼠被放进最后一组”!问题的根源在我不愿意让programmers=mice呀!尊严呢,不要了,要做题要那些东西作甚?
啊~受不了啦!来看看皇家正统翻译:
正确打开方式
Q1:BUT!!这和队列有什么关系???
A1:当然!有啦!这边选完了,优胜者就再次入队进行比较,淘汰者就不用管了(不用再次入队)
Q2:demo(日语),有个问题,就是排名怎么算?
A2:这里要注意的是,每次更新的是优胜者的排名,淘汰者的排名就是分组数+1,为什么呢?很简单,每次分组都会产生组数个优胜者,那么淘汰者就在后面啦!
Q3:等等等等!还有一个问题(pia!你怎么问题那么多,说吧)就是如果不能恰好分成整数组,又该怎么办呢?
A3:好吧好吧,这是要考虑的地方!如果能整除,最好;如果不能,就向下取整然后+1。还有就是,在循环中,我怎么知道后面的老鼠已经不存在了呢(我们是按整数轮取的)这里很巧妙
第i组*每组鼠数+当前这组的第几个>=总共的鼠数就是已经不存在了
Q4:为什么呢?
A4:你可真是!动点脑子吧!举个栗子,如果有11只🐀,每3只一组,那么分成4组,但最后一组只有两只,那么从0~3序号循环,3×3+2就会等于11;但这种情况是不会发生在整除的老鼠身上的,如果12只🐀,每3只一组,那么等分成4组,最后的最后3*3+2也只是11,到不了12,所以这样就可以判断最后一组是否不足3只。
Q5:那那那那…最后一个问题,顺序怎么处理呢?
A5:就把这个顺序入队!而不用把顺序对应的老鼠入队!
好了==,代码时间到

#include<bits/stdc++.h>
#include<iostream>
using namespace std;
#define maxn 1010
struct mouse{
	int weight;
	int rank;
}mice[maxn];
int main(){
	int Np,Ng;
	scanf("%d%d",&Np,&Ng);//Np只老鼠,每Ng只为一组 
	
	for(int i=0;i<Np;i++) scanf("%d",&mice[i].weight);
	queue<int> q;
	int order;
	for(int i=0;i<Np;i++) {
		scanf("%d",&order);
		q.push(order);//入队的是序号,大可不必入队老鼠 
	}
	
	int temp=Np,group;//每一轮比赛的老鼠数目都会更新 
	while(q.size()!=1){
		if(temp%Ng) group=temp/Ng+1;
	    else group=temp/Ng;
	    for(int i=0;i<group;i++){
	    	int max=q.front();
	    	for(int j=0;j<Ng;j++){
	    		if(i*Ng+j>=temp) break;//在最后一组不足Ng时,退出循环 
	    		int front=q.front();
	    		if(mice[front].weight>mice[max].weight) max=front;
	    		mice[front].rank=group+1;//优胜的有group只,那么剩下的就是group+1啦
	    		q.pop();
			}
			q.push(max);//优胜者再次入队 
		}
		temp=group;//有group个优胜者,鼠数更新 
	}
	mice[q.front()].rank=1;//最后一个优胜者要特殊处理,否则名次会是group+1 
	for(int i=0;i<Np;i++){
		printf("%d",mice[i].rank);
		if(i<Np-1) printf(" ");
	}
	return 0;
}

比较草率的一篇,这题嘤语实在搞心态,总结如下:

  • 读懂题目:即使你不愿意承认programmer=mouse,但是就是这样的,接受就行了,有些东西你改变不了,不揣摩出题者的意思题目就做不对,这难道不是义务教务铁律吗?OJ同样如此。
  • 模拟情景很重要:每一轮都要更新胜者数目,胜者再次入队,如何判断最后一组鼠数不足以及如何模拟每一轮都很重要,还有,把老鼠入队dark不必,入队序号即可,每次要改变的是老鼠们的排名,只是数据的再写入,与它本身的顺序并无关系。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值