L1-088 静静的推荐
一、题目
二、解题思路
- 如果有的学生天梯赛成绩虽然与前一个人相同,但其参加过 PAT 考试,且成绩达到了该企业的面试分数线,则也可以接受——同一批次这样的人可以有多个!!!
- 如果 pta 分数不低于 175 ,则相同分数的前 k 个人都会被推荐;
- 如果 pta 分数不低于 175 ,并且 pat 成绩达到了该企业的面试分数线,也会被推荐。
三、代码
正确代码:
#include<iostream>
using namespace std;
int main()
{
int n,k,s,a[300],cot=0;
cin>>n>>k>>s;
for(int i=175;i<300;i++)
{
a[i]=0;
}
while(n--)
{
int x,y;
cin>>x>>y;
if(x>=175 && a[x]<k)
{
a[x]++;
cot++;
}
else if(x>=175 && y>=s)
{
cot++;
}
}
cout<<cot;
return 0;
}
以下代码可以得到每个批次的人的 pta,pat 分数(虽然在这个题目中没有必要),但解决这个题目最后两个测试点会运行超时:
//最后两个测试点超时
#include<iostream>
using namespace std;
//分数和状态
struct Student
{
int pta,pat;
bool flag=true;
}a[100005];
int main()
{
int n,k,s,nn=0;
cin>>n>>k>>s;
// 输入分数并将 pta 分数低于 175 的排除掉
for(int i=0;i<n;i++)
{
int x,y;
cin>>x>>y;
if(x>=175)
{
a[nn].pta=x;
a[nn].pat=y;
nn++;
}
}
n=nn;
// 按照 pta 分数从低到高排序,若pta 分数相同,当 pat 分数达到了面试分数线时排在后边
for(int i=0;i<n-1;i++)
{
for(int j=0;j<n-i-1;j++)
{
if(a[j].pta>a[j+1].pta || (a[j].pta>=a[j+1].pta && a[j].pat>=s))
{
struct Student t;
t=a[j];
a[j]=a[j+1];
a[j+1]=t;
}
}
}
// 模拟
int cot=0;
while(k--)
{
for(int i=0;i<n;i++)
{
if(a[i].flag)
{
cot++;
a[i].flag=false;
for(int j=i+1;j<n;j++)
{
if(a[j].pta==a[i].pta && a[j].pat>=s && a[j].flag)
{
cot++;
a[j].flag=false;
}
else if(a[j].pta>a[i].pta)
{
i=j-1;
break;
}
}
// for(int j=i+1;j<n;j++)
// {
// if(a[j].pta>a[i].pta)
// {
// for(int jj=j-1;jj>i;jj--)
// {
// if(a[jj].pat>=s && a[jj].flag)
// {
// cot++;
// a[jj].flag=false;
// }
// }
// i=j-1;
// break;
// }
// }
}
}
}
cout<<cot;
return 0;
}
四、总结
- 最开始理解错了题意:如果有的学生天梯赛成绩虽然与前一个人相同,但其参加过 PAT 考试,且成绩达到了该企业的面试分数线,则也可以接受——同一批次这样的人可以有多个!!!误以为这样的人只会有一个,导致想复杂了。
- 复杂的思路可以得到每个批次的人的 pta,pat 分数(虽然在这个题目中没有必要),但解决这个题目最后两个测试点会运行超时。