博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
1056__部分正确
阅读量:6248 次
发布时间:2019-06-22

本文共 2546 字,大约阅读时间需要 8 分钟。

hot3.png

模拟题,自己写得烦死了,两个case没过,1个3分1个2分

懒得再写了

#include 
#include 
#include 
#include 
using namespace std;int np, ng;typedef struct { int id; //在ms中的下标就是其唯一识别 int weight; int lostAt; int winAt; int rank;}mouse;mouse ms[1000+5];stack
 loser;//每层失败的loservector
 order;//每次在order里找到最大的,存进winnervector
 winner; void findMax(int start, int end, int level){//从order[start, end)里找到最大weight的值,存进win里 int maxPos = start; int maxWeight = order[maxPos].weight;   for(int j = start+1; j < end; j++){//在一个goup里找最大 if(order[j].weight > maxWeight){ maxPos = j; maxWeight = order[j].weight; } } order[maxPos].winAt = level; //test //printf("found max is%d weight is%d\n",order[maxPos].id, order[maxPos].weight ); winner.push_back(order[maxPos]);}bool cmp(const mouse a, const mouse b){ return (a.winAt>b.winAt);}int main(){ freopen("in.txt","r",stdin); scanf("%d %d",&np, &ng); //不要用order.resize(np), 会导致vector
 order固定大小! for(int i = 0; i < np; i++){ mouse m; m.lostAt = 0; m.winAt = 0; m.id = i; m.rank = -1; scanf("%d", &m.weight); ms[i] = m; } for(int i = 0; i < np; i++){ int id; scanf("%d", &id); order.push_back(ms[id]); //这是个值传递,就是把ms[id]复制进order里了 } int group = np/ng; int left = np%ng; int level = 1;   while(1){ //printf("leve = %d\n", level); int start, end; for(int i = 0; i < group ; i++){ start = i * ng, end = (i+1) * ng; findMax(start, end, level); } if(left > 0){//最后剩余不够ng的成一组 start = group * ng; end = order.size(); findMax(start, end, level); } for(int i = 0; i < order.size(); i++){//这一层的loser if(order[i].winAt < level){ order[i].lostAt =  level; loser.push(order[i]);//loser进栈 } } int len = winner.size(); order = winner;//把winner集合作为下一轮循环的order集合 //test /*for(int i = 0; i < order.size(); i++){ if(order[i].winAt == level){ printf("%d wins at %d\n", order[i].id,order[i].winAt); } }*/ if(len == 1){ break; } group = len/ng; left = len%ng; winner.clear(); level++; } int id = winner[0].id; ms[id].rank = 1;// 第一名 int sameLevelCnt = 0; int curRank = 2; int curLevel = 2; while(!loser.empty()){ mouse m = loser.top();  id = m.id; //test //printf("id = %d  winAt=%d  and curLevel = %d\n",id, m.winAt, curLevel); if(m.winAt == curLevel){  //比较的是m来自loser,修改的是ms[id] sameLevelCnt++; }else if(m.winAt < curLevel){ curRank = curRank+sameLevelCnt; sameLevelCnt = 1; curLevel--; } ms[id].rank = curRank; loser.pop();   } for(int i = 0; i < np-1; i++){ printf("%d ", ms[i].rank); } printf("%d", ms[np-1].rank); return 0;}

转载于:https://my.oschina.net/kaneiqi/blog/305924

你可能感兴趣的文章
Sublime 中文标题乱码
查看>>
世界上最幸福的职业-鉴黄师
查看>>
asp.net 10 Cookie & Session
查看>>
[置顶]C# 邮件发送方法【NetMail方式】
查看>>
一个数据库系统的笔试题
查看>>
使用Form个性化修改标准Form的LOV
查看>>
第二阶段冲刺06
查看>>
六、input框中的数字(金额)只能输入正整数
查看>>
UE 正则表达式匹配某一标签内容
查看>>
selenium 模型简单理解
查看>>
给div加上padding和border,如何不让div整体改变
查看>>
sap MD04中常用函数
查看>>
通过MySQL自动同步刷新Redis
查看>>
vuex简单示例
查看>>
根据数据库结构生成RzCheckTree
查看>>
hihocoder [Offer收割]编程练习赛8 矩形计数
查看>>
汇编实验九
查看>>
哈夫曼编码
查看>>
go语言学习之闭包函数
查看>>
javax.servlet.http.HttpServletRequest; 不存在
查看>>