大一寒假培训(二)——快排与桶排
大一寒假培训(二)
今天是寒假培训的第二天,今天学了快排和桶排。以下是今天做的习题。
nefu 1481 谁考了第k名-排序
#include <bits/stdc++.h>
using namespace std;
typedef struct stu{int num;double grade;
}stu;
stu p[200];
int cmp(stu a,stu b) //按成绩从大到小的顺序排序
{return a.grade>b.grade;}
int main()
{int n,k;while(cin>>n>>k){for(int i=0;i<n;i++)cin>>p[i].num>>p[i].grade;sort(p,p+n,cmp);printf("%d %g\n",p[k-1].num,p[k-1].grade);}return 0;
}
nefu 1482 奇数单增序列
#include <bits/stdc++.h>
using namespace std;
int num1[500],num2[500];
int main()
{int n,j;while(cin>>n){j=0;for(int i=0;i<n;i++) //输入数据cin>>num1[i];for(int i=0;i<n;i++) //将奇数从num1数组中取出,放到num2数组if(num1[i]%2)num2[j++]=num1[i];sort(num2,num2+j); //默认从小到大排序for(int i=0;i<j;i++){if(i==j-1)cout<<num2[i]<<endl;elsecout<<num2[i]<<',';}}return 0;
}
nefu 1483 成绩排序
#include <bits/stdc++.h>
using namespace std;
typedef struct stu{char name[20];int grade;
}stu;
stu p[20];
bool cmp(stu a,stu b) //先按成绩排序,若成绩相同,则按名字字典顺序排序
{if(a.grade==b.grade) return strcmp(a.name,b.name)<0;else return a.grade>b.grade;
}
int main()
{int n;while(cin>>n){for(int i=0;i<n;i++)cin>>p[i].name>>p[i].grade;sort(p,p+n,cmp);for(int i=0;i<n;i++)cout<<p[i].name<<' '<<p[i].grade<<endl;}return 0;
}
nefu 1659 没必要的排序1
#include <bits/stdc++.h>
using namespace std;
int num[1000];
int main()
{int n,k,sum;while(cin>>n>>k){for(int i=0;i<n;i++)cin>>num[i];sort(num,num+n,greater<int>()); //按照从大到小排序sum=0;for(int i=0;i<k;i++)sum+=num[i];cout <<sum<<endl;}return 0;
}
nefu 1650 没必要的排序2
前一道题的加强版。
说实话做这道题的时候,想用快排直接做,结果直接TLE了。
后来想了想,考虑用桶排做,果然对了。
#include <bits/stdc++.h>
using namespace std;
int a[100001]={0}; //创建一个1e7的桶
int main()
{long long ans;int n,k,x,z;while(cin>>n>>k){for(int i=1;i<=100000;i++)a[i]=0;for(int i=0;i<n;i++){ //输入数据,并把它放进桶中cin>>x;a[x]++;}ans=z=0;for(int i=100000;i>0;i--){ //从大到小累加,发现加多之后,把多余部分去除if(a[i]){z+=a[i];ans+=a[i]*i;if(z>=k){ans-=i*(z-k);break;}}}cout<<ans<<endl;}return 0;
}
中间加和的时候还可以这样
if(a[i]){ //这个方法好在每次只加a[i]和k-z的最小值,不会出现多加的情况ans+=min(a[i],k-z)*i;z+=a[i];if(z>=k) break;
}
nefu 554 老和尚的导员
#include <bits/stdc++.h>
using namespace std;
typedef struct stu{int num,sum;int c; //C语言成绩int xd; //线代成绩int gs; //高数成绩int yy; //英语成绩
}stu;
stu a[100];
bool cmp(stu a,stu b) //函数以return为结束,所以可以不必写else
{if(a.sum!=b.sum) return a.sum>b.sum; //先按总成绩排序if(a.c!=b.c) return a.c>b.c; //总成绩相同,按C语言成绩排序if(a.xd!=b.xd) return a.xd>b.xd; //C语言成绩相同,按线代成绩排序if(a.gs!=b.gs) return a.gs>b.gs; //线代成绩相同,按高数成绩排序return a.yy>b.yy; //高数成绩相同,按英语成绩排序
}
int main()
{int n;while(cin>>n){for(int i=0;i<n;i++){cin>>a[i].c>>a[i].xd>>a[i].gs>>a[i].yy;a[i].num=i+1; //对每个和尚进行标号a[i].sum=a[i].c+a[i].xd+a[i].gs+a[i].yy; //求总成绩}sort(a,a+n,cmp); //调用cmp函数,按照cmp函数的要求排序for(int i=0;i<n;i++)cout << a[i].num << " " << a[i].sum <<endl;}return 0;
}
nefu 556 健忘的老和尚
#include <bits/stdc++.h>
using namespace std;
typedef struct stu{char name[100];int grade;
} stu;
stu a[100];
bool cmp(stu a,stu b) //按照成绩从低到高排序
{return a.grade<b.grade;}
int main()
{int n,m,o;swhile(cin>>n>>m>>o){for(int i=0;i<n;i++)cin>>a[i].name>>a[i].grade;sort(a,a+n,cmp);for(int i=n-m;i<n;i++) //题目要求先输出有奖学金的,再输出补考的cout<<a[i].name<<endl;for(int i=0;i<o;i++)cout<<a[i].name<<endl;}return 0;
}
nefu 873 戏说三国
#include <bits/stdc++.h>
using namespace std;
typedef struct hero{char name[20];int num;double zy,dy,wy,sum;
}hero;
hero a[100000];
bool cmp(hero a,hero b)
{if(a.sum!=b.sum) return a.sum>b.sum; //先按照总分排序 if(a.zy!=b.zy) return a.zy>b.zy; //总分相同,按智育排序 if(a.dy!=b.dy) return a.dy>b.dy; //智育相同,按德育排序 return a.wy>b.wy; //德育相同,按武育排序
}
int main()
{int t,n;double b,c,d;while(cin >> t){for(int i=0;i<t;i++){cin >> n >> b >> c >> d;for(int j=0;j<n;j++){cin >> a[j].name >> a[j].zy >> a[j].dy >> a[j].wy;a[j].num=i+1;a[j].zy*=c/100;a[j].dy*=b/100;a[j].wy*=d/100; //计算折合过的分数a[j].sum=a[j].zy+a[j].dy+a[j].wy; //计算总分}sort(a,a+n,cmp);printf("Case #%d:\n",a[i].num);for(int j=0;j<n;j++)printf("%s %.4f %.4f %.4f %.4f\n",a[j].name,a[j].sum,a[j].zy,a[j].dy,a[j].wy);}}return 0;
}
这题有一个坑,加权的比率不是a%,b%,c%,而是b%,a%,c%,导致我第一次直接WA。
nefu 874 相约摩洛哥
#include <bits/stdc++.h>
using namespace std;
typedef struct team{char name[10];int a[3],b[3];int time,ac;
}team;
team q[100000];
bool cmp(team a,team b) //先按ac的题目数排序,再按照罚时排序
{if(a.ac==b.ac) return a.time<b.time;else return a.ac>b.ac;
}
int main()
{int n;while(cin >> n){for(int i=0;i<n;i++)cin >> q[i].name >> q[i].a[0] >> q[i].a[1] >> q[i].a[2];for(int i=0;i<n;i++)cin >> q[i].b[0] >> q[i].b[1] >> q[i].b[2];for(int i=0;i<n;i++){q[i].time=q[i].ac=0;for(int j=0;j<3;j++){if(q[i].a[j]!=-1){ //题目要求若时间不为-1,则表示这题acq[i].time+=q[i].a[j];q[i].time+=20*(q[i].b[j]-1);q[i].ac++;}}}sort(q,q+n,cmp);for(int i=0;i<n;i++)cout << q[i].name << " " << q[i].ac << " " << q[i].time << endl;}return 0;
}
nefu 1297 结构体排序题一
#include <bits/stdc++.h>
using namespace std;
typedef struct point{int x,y;
}point;
point z[100];
//四个函数均为先按x排序,再按y排序
bool cmp1(point a,point b) //按照x升序,y升序排序
{if(a.x==b.x) return a.y<b.y;else return a.x<b.x;
}
bool cmp2(point a,point b) //按照x升序,y降序排序
{if(a.x==b.x) return a.y>b.y;else return a.x<b.x;
}
bool cmp3(point a,point b) //按照x降序,y升序排序
{if(a.x==b.x) return a.y<b.y;else return a.x>b.x;
}
bool cmp4(point a,point b) //按照x降序,y降序排序
{if(a.x==b.x) return a.y>b.y;else return a.x>b.x;
}
int main()
{int a,b,n;while(cin>> a >> b >> n){for(int i=0;i<n;i++)cin >> z[i].x >> z[i].y;if(a==0&&b==0)sort(z,z+n,cmp4);if(a==0&&b==1)sort(z,z+n,cmp3);if(a==1&&b==0)sort(z,z+n,cmp2);if(a==1&&b==1)sort(z,z+n,cmp1);for(int i=0;i<n;i++)printf("(%d,%d)\n",z[i].x,z[i].y);}return 0;
}
大一寒假培训(二)——快排与桶排相关推荐
- 大一寒假培训(三)——暴力枚举及妙用
大一寒假培训(三) 经过两天的培训之后,第三天也到来了.今天讲的是暴力枚举.好像没什么可讲的(悄咪咪地说) 接下来还是今天的练习 nefu 8 二倍的问题 Description 给定2到15个不同的 ...
- NEFU 大一寒假培训【一】二维数组、结构体
主题:二维数组.结构体 A 二维矩阵对角线和 Description 计算m×m的方阵的对角线所有元素的和 Input 输入数据有多组,每组第1行为m (2<=m<=10),接下来有m行m ...
- 大一寒假培训(七)——队列与优先队列
文章目录 队列的定义 队列的基本操作 周末舞会 取纸牌游戏 海港(NOIP2016普及组真题) Blash数集-队列-set 优先队列 优先队列的定义 优先队列的定义方法 用结构体定义优先队列(重载函 ...
- 2020大一寒假培训三 (暴力)
比例简化 Problem:J Time Limit:1000ms Memory Limit:65535K Description 在社交媒体上,经常会看到针对某一个观点同意与否的民意调查以及结果.例如 ...
- NEFU 大一寒假训练十二(set)2020.02.18
Summary 可能是昨天的题少了一些,今天的题多了一堆,还疯狂TLE /(ㄒoㄒ)\~~ Information No. Title AC/Submit A 明明的随机数-set 60/101 B ...
- 常用技巧 —— 桶排
[概述] 桶排的思想是一种比较重要的技巧,在 由于桶排的特殊性,桶排仍需进行模拟装桶的过程,而且有时由于数据范围无法开很大的数组,需要使用 map 与其结合 关于桶排:点击这里 [例题] Romaji ...
- 【LeetCode笔记】215. 数组中的第K个最大元素(Java、快排、堆排、并发快排)
文章目录 题目描述 思路 & 代码 快排 基于 Fork / Join 的并发快排 针对 topK 的快排优化 堆排 基本堆排 结合题目的堆排 二刷 题目描述 大名鼎鼎的TOP K,主要考察排 ...
- NEFU 大一寒假训练六(二分查找)题目预测
说明 预测原理还是基于这篇文章:NEFU OJ 比赛试题预测 (Python) 为防止格式更正导致文章进入待审核状态,所以今天晚上就不修正格式了 如果有格式问题请自行理解,问题产生主要与Markdow ...
- [转载]高一语文必修一寒假作业二
[转载]高一语文必修一寒假作业二 2012年01月15日 高一语文必修一寒假作业二 一.(每小题3分,共15分) 1.下列加黑字读音全部正确的一项是() A.岑(cén)寂 勾(gōu)当 蕴藉(jí ...
最新文章
- 小程序云开发数据库在网站读取
- Mac安装双系统-win10
- 如何排查模组无法识别SIM卡?
- Typescript04---模块、命名空间
- octave安装 缺java_Octave信号包安装
- [集训队作业2018] 三角形(贪心,堆,线段树合并)
- LG-Transformer:全局和局部建模Transformer结构新作
- sbt笔记二 Running
- snipaste如何滚动截图_每天都在用的QQ截图,居然升级了这么多实用功能!
- Python获取列表中字符串最长位置处的索引值
- opencv读取视频,读取摄像头
- 基于FPGA的冗余链路高速切换解决方案
- 源码编译Redis Desktop Manager参考
- 机器算法基础——回归分析
- 实时计算与SparkSteaming的对比
- 怎么开发联机小游戏_微信小游戏创意大赛火热进行中,小游戏联机对战引擎免费用...
- 速度来看mac电脑怎么彻底关闭系统更新
- libsvm for matlab安装与测试
- WSL 错误 System has not been booted with systemd as init system (PID 1). Can‘t operate
- 使用Bouncy Castle实现RSA加密