数据结构 | 队列:1056(考验题目理解能力)
给这题安上“队列”的标签其实是存疑的,因为这个模拟过程我都没有用到队列,而是用到vector。也没有用到先进先出的性质……
其实这题思路不难,难的是题目的理解。难理解的一共两个点:
①第一行是按索引排列的重量,第二行是按索引排列的序号。结合permutaion(组合)这个单词,大概可以猜到陈越姥姥想表达,或者想设坑什么了。
②rank的计算。每一次循环都给vector里面的元素赋上rank属性,但是rank怎么计算呢?
我在题目中勉强找到一个关于rank的描述:
All the losers in this turn are ranked the same. Every NG winners are then grouped in the next match until a final winner is determined.
那么“same”又是什么呢?手动再见。
根据题解,或者自行对样例数据进行分析,rank=这一轮组数+1,最后的获胜者rank=1 。
贴出OJ地址希望日后看懂题:Mice and Rice
一个需要注意的点:每轮记录最大值是记录 weight 最大老鼠的 order
AC代码:
#include <stdio.h> #include <memory.h> #include <math.h> #include <string> #include <vector> #include <set> #include <stack> #include <queue> #include <algorithm> #include <map> #define I scanf #define OL puts #define O printf #define F(a,b,c) for(a=b;a<c;a++) #define FF(a,b) for(a=0;a<b;a++) #define FG(a,b) for(a=b-1;a>=0;a--) #define LEN 10010 #define MAX 0x06FFFFFF #define V vector<int> using namespace std; int o[LEN]; int w[LEN]; int Rank[LEN]; int main(){ // freopen("1056.txt","r",stdin); int p,g,n; int i,j; I("%d%d",&p,&g); FF(i,p) I("%d",&w[i]); FF(i,p) I("%d",&o[i]); vector<int> pre(o,o+p); vector<int> cur; while(1){ cur.clear(); int sz=pre.size(); int ng=sz/g; if(sz%g) ng++; FF(i,pre.size()) Rank[pre[i]]=ng+1; FF(i,ng){ int maxv=-1,x; for(j=i*g;j<min( (i+1)*g, sz );j++){ if(w[pre[j]]>maxv){ maxv=w[pre[j]]; x=pre[j]; } } cur.push_back(x); } pre=cur; if(cur.size()==1){ Rank[cur[0]]=1; break; } } FF(i,p){ O("%d",Rank[i]); if(i!=p-1) O(" "); } return 0; }