PAT A1056 Mice and Rice
代码:
#include <iostream>
#include <algorithm>
using namespace std;
struct mouse {
int weight;
int R = 0;//轮数
int no;//用来记录输入第三号数据后的初始顺序
int rank;//记录排序结果
int begin;
}m[1005];
//排序算法1,按题目顺序排序
bool cmp1(mouse a,mouse b) {
return a.no < b.no;
}
//排序算法2,按轮数降序排,输出
bool cmp2(mouse a, mouse b) {
if(a.R!=b.R) return a.R > b.R;
else return a.no < b.no;
}
bool cmp3(mouse a, mouse b) {
return a.begin < b.begin;
}
int main() {
int NP, NG, NP_copy;
cin >> NP >> NG;
NP_copy = NP;
int r = ceil(1.0*NP / NG);
int no;
bool flag = true;
for (int i = 0; i < NP; i++) {
cin >> m[i].weight;
m[i].begin = i;
}
for (int i = 0; i < NP; i++) {
cin >> no;
m[no].no = i;
}
sort(m, m + NP, cmp1);
while (flag) {
int i = 0;
while (i < NP) {
int j = 0;
while (j < r) {
//r组比较
int max = -1, num, k = 0;
while (k < NG&&i < NP) {
if (m[i].weight > max) {
max = m[i].weight;
num = i;
}
k++; i++;
}
m[num].R++;
j++;
}
}
if (r == 1) flag = false;
else {
sort(m, m + NP_copy, cmp2);
NP = r;
r = ceil(1.0*r / NG);
}
}
//根据R排序
sort(m, m + NP_copy, cmp2);
m[0].rank = 1;
for (int i = 1; i < NP_copy; i++) {
if (m[i].R == m[i - 1].R) m[i].rank = m[i - 1].rank;
else m[i].rank = i+1;
}
//根据第二行输入顺序输出结果
sort(m, m + NP_copy, cmp3);
for (int i = 0; i < NP_copy; i++) {
cout << m[i].rank;
//cout <<" "<< m[i].R << endl;
if (i < NP_copy - 1) cout << " ";
}
return 0;
}
自定义结构体中的m[i].begin ,用来记录最开始的输入顺序(结果也需要按这个顺序输出)
m[i].no,用来记录按输入调整后的顺序(在比较过程中用到)
m[i].rank用来给比较结果排序,是算法笔记中提到的常用方法
这个题目这样解感觉很粗暴也很繁琐
算法笔记中的答案是按队列的思路解的 还未看过