您的位置:首页 > 其它

PAT 1016 Mice and Rice (25)

2016-07-24 11:44 323 查看

思路

1.这个问题有点烦,感觉可以总结一下

2总结就是当下一轮还大于1的话,继续往下分

3.首先每p个找出最大的值m以及m_id

4.然后把这个最大的id装到原来的order中,用num计数

5..更新remain,记得其他的的排名要在原来的基础上加next,即剩下的个数。

我出错的一些点

1.不想吐槽了,这道题每个英文单词每句话都看懂了,就是没理解题目是什么意思。就是这句,The third line gives the initial playing order which is a permutation of 0,…NP-1.

2.最后那个只有一个了,就退出循环了,所以最后所有都加一。

代码

#include <iostream>
#include <vector>
#include <math.h>
#include<algorithm>

using namespace std;

int main()
{
ios::sync_with_stdio(false);
int n, p;
cin >> n >> p;
vector<int> mouse(n),order(n),sx(n,0);
for (int i = 0; i < n; i++)
{
cin >> mouse[i];
}
for (int i = 0; i < n; i++)
{
cin >> order[i];
}
int remain = n;
//这个问题有点烦,感觉可以总结一下
//总结就是当下一轮还大于1的话,继续往下分
//1.首先每p个找出最大的值m以及m_id
//2.然后把这个最大的id装到原来的order中
//3.更新remain,记得其他的的排名要在原来的基础上加next,即剩下的个数
while (remain>1)
{
int num = 0;
//cout << "remain:" << remain << endl;
for (int i = 0; i < remain; i = i + p)
{
/*cout << "order:" << endl;
for (int i = 0; i < remain; i++)
{

if (i != n - 1)
cout << order[i] << " ";
else
cout << order[i] << endl;
}*/
int m = -1,m_id=-1;
for (int j = 0; j < p&&i+j<remain; j++)
{
//cout << "aaa" << endl;
int ch = order[i + j];
//m = max(mouse[ch], m);
//这里出错了卧槽
//m_id = ch;
if (m < mouse[ch])
{
m = mouse[ch];
m_id = ch;
}

}
//cout << "m:" << m << " m_id:" << m_id << endl;
for (int j = 0; j < p&&i + j<remain; j++)
{
//cout << "bbb" << endl;
int ch = order[i + j];
if (ch != m_id)
{
//cout << "bb" << endl;
int next = (remain + p - 1) / p;
sx[ch]=sx[ch]+next;
}
}
order[num++] = m_id;

}
/*if (remain == 1)
{
int ch = order[0];
for (int i = 0; i < n&&i!=ch; i++)
{
sx[i]++;
}
break;
}*/
remain = (remain + p - 1) / p;
}
for (int i = 0; i < n; i++)
{
//最后那个只有一个了,就退出循环了,所以最后所有都加一
if (i != n - 1)
cout << sx[i] + 1 << " ";
else
cout << sx[i]+1 << endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: