(排序)P1068 分数线划定

题解:

需要注意的是,快排完之后并不是按照编号从小到大的顺序输出

#include<iostream>
using namespace std;
int r=0;
void swap(int &a,int &b){
  int t=a;
  a=b;
  b=t;
 }
void sort(int s[],int l,int r,int k[])
{
    int mid=s[(l+r)/2];
    int i=l,j=r;
    do{
        while(s[i]>mid) i++;
        while(s[j]<mid) j--;
        if(i<=j)
        {
            swap(s[i],s[j]);
            swap(k[i],k[j]);
            i++;
            j--;
        }
    }while(i<=j);
    if(l<j) sort(s,l,j,k);
    if(i<r) sort(s,i,r,k);
}
void sort2(int s[],int k[],int i)

 if(k[i]>k[i+1]){
    swap(k[i],k[i+1]);
 }
 r=i+1;
 if(s[r]==s[r+1]){
  sort2(s,k,r);
 }else{
  return;
 }
 if(k[i]>k[i+1]){
    swap(k[i],k[i+1]);
 }
 return ;
}

int main()
{
 int n,m;
 cin>>n>>m;
 int k[n],s[n];
 for(int i=0;i<n;i++){
  cin>>k[i]>>s[i];
 }
 
 sort(s,0,n-1,k);
 
 int ret=m*1.5;
 while(s[ret-1]==s[ret]){
  ret++;
 }

//重点是可能循环一次并不能将顺序排正

//其实现在想想,可以只对成绩重复那些人进行一次冒泡排序即可
 int key=1;
 while(key){
  for(int i=0;i<ret;i++){
   if(s[i]==s[i+1]&&k[i]>k[i+1]){
    for(i;i<ret;i++){
     if(s[i]==s[i+1]){
      sort2(s,k,i);
      i=r;
     }
    }
    break;
   }
   if(i==ret-1){
    key=0;
   }
  }
 }
 
 cout<<s[ret-1]<<" "<<ret<<endl;
 for(int i=0;i<ret;i++){
  cout<<k[i]<<" "<<s[i]<<endl;
 }
 return 0;
}

原文地址:https://www.cnblogs.com/lijiahui-123/p/12320921.html

时间: 2024-10-26 03:03:30

(排序)P1068 分数线划定的相关文章

洛谷 P1068 分数线划定 题解

此文为博主原创题解,转载时请通知博主,并把原文链接放在正文醒目位置. 题目链接:https://www.luogu.org/problem/show?pid=1068 题目描述 世博会志愿者的选拔工作正在 A 市如火如荼的进行.为了选拔最合适的人才,A 市对 所有报名的选手进行了笔试,笔试分数达到面试分数线的选手方可进入面试.面试分数线根 据计划录取人数的150%划定,即如果计划录取m名志愿者,则面试分数线为排名第m*150% (向下取整)名的选手的分数,而最终进入面试的选手为笔试成绩不低于面试

P1068 分数线划定

题目描述 世博会志愿者的选拔工作正在 A 市如火如荼的进行.为了选拔最合适的人才,AA市对所有报名的选手进行了笔试,笔试分数达到面试分数线的选手方可进入面试.面试分数线根据计划录取人数的150\%150%划定,即如果计划录取mm名志愿者,则面试分数线为排名第m \times 150\%m×150%(向下取整)名的选手的分数,而最终进入面试的选手为笔试成绩不低于面试分数线的所有选手. 现在就请你编写程序划定面试分数线,并输出所有进入面试的选手的报名号和笔试成绩. 输入输出格式 输入格式: 第一行,

【6.18校内test】T2分数线划定

分数线划定[题目链接] 这道题也不是什么难题,思路一带而过吧: SOLUTION: First.输入n,m,计算m*1.5的值,接着输入编号和成绩,然后我的做法是在输入编号成绩之后,开一个101大小的数组来记录某个分数段的人数(因为分数是0~100所以才敢这么干qwq大了就怂了). Second.使用最简单好用的sort进行排序,按照成绩从高到低排,如果成绩相同,编号小的在前面. Third.进行分数线划定,这里喜欢用while(不会用for写这个的说),首先我们先选择恰为计划录取人数的150%

Luogu 1068 - 分数线划定 - [快速排序]

题目链接:https://www.luogu.org/problemnew/show/P1068 题目描述世博会志愿者的选拔工作正在 A 市如火如荼的进行.为了选拔最合适的人才,A 市对所有报名的选手进行了笔试,笔试分数达到面试分数线的选手方可进入面试.面试分数线根据计划录取人数的 $150\%$ 划定,即如果计划录取 $m$ 名志愿者,则面试分数线为排名第 $m \times 150\%$(向下取整)名的选手的分数,而最终进入面试的选手为笔试成绩不低于面试分数线的所有选手. 现在就请你编写程序

数据排序 第二讲( 各种排序方法 结合noi题库1.10)

先来个题练练手吧! 例题 04:奖学金 查看 提交 统计 提问 总时间限制:  1000ms 内存限制:  65536kB 描述 某小学最近得到了一笔赞助,打算拿出其中一部分为学习成绩优秀的前5名学生发奖学金.期末,每个学生都有3门课的成绩:语文.数学.英语.先按总分从高到低排序,如果两个同学总分相同,再按语文成绩从高到低排序,如果两个同学总分和语文成绩都相同,那么规定学号小的同学排在前面,这样,每个学生的排序是唯一确定的. 任务:先根据输入的3门课的成绩计算总分,然后按上述规则排序,最后按排名

大神刷题表

9月27日 后缀数组:[wikioi3160]最长公共子串 dp:NOIP2001统计单词个数 后缀自动机:[spoj1812]Longest Common Substring II [wikioi3160]最长公共子串 [spoj7258]Lexicographical Substring Search 扫描线+set:[poj2932]Coneology 扫描线+set+树上删边游戏:[FJOI2013]圆形游戏 结论:[bzoj3706][FJ2014集训]反色刷 最小环:[poj1734

整理小朋友在noi.openjudge上的作业(1)

NOI(题库正在建设中,做题纪录有可能会被删除,请注意) 第一章的统计放前面 1 编程基础之输入输出 10 0 0% 最基础有空补刷 2 编程基础之变量定义.赋值及转换 10 0 0% 最基础有空补刷 3 编程基础之算术表达式与顺序执行 20 0 0% 最基础有空补刷 4 编程基础之逻辑表达式与条件分支 21 0 0% 最基础有空补刷 5 编程基础之循环控制 45 10 22% 最基础有空补刷 6 编程基础之一维数组 15 5 33% 最基础有空补刷 7 编程基础之字符串 35 0 0% 有必要

[NOIP2009] 普及组

多项式输出 模拟 1 /*by SilverN*/ 2 #include<algorithm> 3 #include<iostream> 4 #include<cstring> 5 #include<cstdio> 6 #include<cmath> 7 #include<vector> 8 using namespace std; 9 const int mxn=110; 10 int read(){ 11 int x=0,f=1;

时间序列滑动窗口和时间穿越问题

什么是时序数据 时序数据是指时间序列数据.时间序列数据是同一指标按时间顺序记录的数据列.在同一数据列中的各个数据必须是同类的,要求具有可比性.简单的来说,就是按照时间为索引的数据列. 如何使用时序数据 对时间序列分析的目的是通过找出样本内时间序列的统计特性和发展规律性,基于规律构建时间序列模型,进行样本预测. 那么对于时序数据,我们通常会去分析数据的极值,中值,偏差,方差,同比,环比以及数据的周期性等特点,从而去总结数据的一些特征,进而对数据有一个大致的认识. 同时,我们还可以使用滑窗统计,即按