PAT 1015 德才论(满分版)

2024-02-29 09:50
文章标签 满分 1015 pat 德才

本文主要是介绍PAT 1015 德才论(满分版),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1.出现超时的情况,使用了一个快速排序,一个冒泡排序,来尽力下降时间,不过还是会超,当然这种情况是一种比较常规的思路。不过很明显这个题,应该是要使用其他的方法,不然超时确实难以改善,我想着全部用快排解决,但错误增加,时间没减,只能选择放弃快排解决一切。先给出这个常规思路但超时的代码。待完善后再附上之后代码。

2.年前去了外婆家待了些时间,一直未更。

3.对于这个题,需用到库函数中的一个sort函数,即 #include <algorithm> ,其他的就是写一个比较参数了,具体就看下方了。


#include <iostream>
#include <cstring>using namespace std;struct stu{int no;  //学号int ds;  //德分int cs;  //才分
}; void Qsort(stu *s, int low, int high){if (high <= low)  return;int i = low;int j = high + 1;int  key = s[low].ds + s[low].cs;int key_ds = s[low].ds;int key_cs = s[low].cs;int key_no = s[low].no;while (true){/*从左向右找比key小的值*/i++;  while ((s[i].ds+s[i].cs) > key){    	if (i == high){break;}i++;}/*从右向左找比key大的值*/j--;while ((s[j].ds+s[j].cs) < key){   if (j == low){break;}j--;}	if (i >= j) break;/*交换i,j对应的值*/int temp = s[i].no;s[i].no= s[j].no;s[j].no = temp;int temp_ds = s[i].ds;s[i].ds = s[j].ds;s[j].ds = temp_ds;int temp_cs = s[i].cs;s[i].cs = s[j].cs;s[j].cs = temp_cs;   }/*中枢值与j对应值交换*/s[low].no = s[j].no;s[j].no = key_no;s[low].ds = s[j].ds;s[j].ds = key_ds;s[low].cs = s[j].cs;s[j].cs = key_cs;Qsort(s, low, j - 1);Qsort(s, j + 1, high);
}void Bubble_sort_2(stu *ss, int c)
{for(int i=0;i<c-1;i++){for(int j=0;j<c-1-i;j++){int total_1 = ss[j].ds + ss[j].cs;int total_2 = ss[j+1].ds + ss[j+1].cs;if(total_1 == total_2){//cout<<"总分相同情况..."<<endl;if(ss[j].ds < ss[j+1].ds){int temp_no = ss[j].no;ss[j].no = ss[j+1].no;ss[j+1].no = temp_no; int temp_ds = ss[j].ds;ss[j].ds = ss[j+1].ds;ss[j+1].ds = temp_ds;int temp_cs = ss[j].cs;ss[j].cs = ss[j+1].cs;ss[j+1].cs = temp_cs;}else if(ss[j].ds == ss[j+1].ds){//cout<<"德分相同情况..."<<endl; if(ss[j].no > ss[j+1].no){int temp_no = ss[j].no;ss[j].no = ss[j+1].no;ss[j+1].no = temp_no; int temp_ds = ss[j].ds;ss[j].ds = ss[j+1].ds;ss[j+1].ds = temp_ds;int temp_cs = ss[j].cs;ss[j].cs = ss[j+1].cs;ss[j+1].cs = temp_cs;}}}} }}//
void Bubble_sort(stu *ss,int c)
{for(int i=0;i<c-1;i++){for(int j=0;j<c-1-i;j++){int total_1 = ss[j].ds + ss[j].cs;int total_2 = ss[j+1].ds + ss[j+1].cs;if(total_1<total_2){int temp_no = ss[j].no;ss[j].no = ss[j+1].no;ss[j+1].no = temp_no; int temp_ds = ss[j].ds;ss[j].ds = ss[j+1].ds;ss[j+1].ds = temp_ds;int temp_cs = ss[j].cs;ss[j].cs = ss[j+1].cs;ss[j+1].cs = temp_cs;}else if(total_1 == total_2){//cout<<"总分相同情况..."<<endl;if(ss[j].ds < ss[j+1].ds){int temp_no = ss[j].no;ss[j].no = ss[j+1].no;ss[j+1].no = temp_no; int temp_ds = ss[j].ds;ss[j].ds = ss[j+1].ds;ss[j+1].ds = temp_ds;int temp_cs = ss[j].cs;ss[j].cs = ss[j+1].cs;ss[j+1].cs = temp_cs;}else if(ss[j].ds == ss[j+1].ds){//cout<<"德分相同情况..."<<endl; if(ss[j].no > ss[j+1].no){int temp_no = ss[j].no;ss[j].no = ss[j+1].no;ss[j+1].no = temp_no; int temp_ds = ss[j].ds;ss[j].ds = ss[j+1].ds;ss[j+1].ds = temp_ds;int temp_cs = ss[j].cs;ss[j].cs = ss[j+1].cs;ss[j+1].cs = temp_cs;}}}} }}int main()
{stu *s = new stu[100000];int stu_num;int l;int h;// cin>>stu_num>>l>>h;scanf("%d %d %d",&stu_num,&l,&h);for(int i=0;i<stu_num;i++){//cin>>s[i].no>>s[i].ds>>s[i].cs;scanf("%d %d %d",&s[i].no,&s[i].ds,&s[i].cs);}int count_1 = 0;for(int i=0;i<stu_num;i++){if(s[i].ds>=l && s[i].cs>=l){count_1++;} }printf("%d\n",count_1);//第一类 stu *s1 = new stu[100000];  int c1 = 0;//第二类stu *s2 = new stu[100000];int c2 = 0; //第三类stu *s3 = new stu[100000];int c3 = 0; //第四类stu *s4 = new stu[100000];int c4 = 0; for(int i=0;i<stu_num;i++){if(s[i].ds>=l && s[i].cs>=l){   //第一类 if(s[i].ds>=h && s[i].cs>=h){//	cout<<"都按总分 才德兼备:,之后若总分相同,德高先,若德同,考号小到大"<<s[i].no<<endl; s1[c1].no = s[i].no;s1[c1].ds = s[i].ds;s1[c1].cs = s[i].cs;c1++;}  //第二类 else if(s[i].ds>=h && s[i].cs<h){//cout<<"才不到,德到"<<endl;s2[c2].no = s[i].no;s2[c2].ds = s[i].ds;s2[c2].cs = s[i].cs;c2++;} //第三类else if(s[i].ds<h && s[i].cs<h && s[i].ds>=s[i].cs){//cout<<"才德均低,但德高才";s3[c3].no = s[i].no;s3[c3].ds = s[i].ds;s3[c3].cs = s[i].cs;c3++;}   //其他类 else{s4[c4].no = s[i].no;s4[c4].ds = s[i].ds;s4[c4].cs = s[i].cs;c4++; }} }Qsort(s1,0,c1-1);Bubble_sort_2(s1,c1);for(int i=0;i<c1;i++){printf("%d %d %d\n",s1[i].no,s1[i].ds,s1[i].cs);}Qsort(s2,0,c2-1);Bubble_sort_2(s2,c2);for(int i=0;i<c2;i++){printf("%d %d %d\n",s2[i].no,s2[i].ds,s2[i].cs);}Qsort(s3,0,c3-1);Bubble_sort_2(s3,c3);for(int i=0;i<c3;i++){ printf("%d %d %d\n",s3[i].no,s3[i].ds,s3[i].cs);}Qsort(s4,0,c4-1);Bubble_sort_2(s4,c4);for(int i=0;i<c4;i++){   printf("%d %d %d\n",s4[i].no,s4[i].ds,s4[i].cs);}}

其提交结果:

 .............................................................

补充完善:

这里对cmp函数做些简单的理解:

//以下举一个小例子:
//若要对数组a进行从大到小排序:
//第一种方式
bool cmp(int x,int y)
{return x>y;  //x,y可以理解为同属a数组中不同数据
}//第二种
bool c2mp(int x,int y)
{                        //该种方式的两个if判断都是表示从大到小排序,但单写第一个似乎不太好使//故而都写就确保各种情况都能考虑到了,从小到大则反之即可if(x>y) return true;if(x<y) return false;}//第三种
int c3mp(int x,int y)
{if(x>y) return 1;if(x<y) return 0;
}int main()
{int a[5] = {2, 1, 3, 5, 4};sort(a, a + 5, cmp);for (int i = 0; i < 5; i++) cout << a[i] << " ";}

此题cmp函数

int cmp(stu x,stu y)  //可看做同属一个结构体数组中的两个不同成员,类似上方例子中a数组中x,y
{//总分不同的情况,按总分从大到小排序if(x.ds+x.cs > y.ds+y.cs)  return 1;if(x.ds+x.cs < y.ds+y.cs)  return 0;//总分相同,德分不一样,按德分从大到小排序if(x.ds>y.ds) return 1;if(x.ds<y.ds) return 0;//德分相同,按学号从小到大排序if(x.no<y.no) return 1;if(x.no>y.no) return 0;} 
//这个也是一种,其实一样bool cmp(stu x,stu y)
{//总分不同排序 if(x.ds+x.cs > y.ds+y.cs)  return true;  if(x.ds+x.cs < y.ds+y.cs)  return false;  //总分相同,德分不同 if(x.ds>y.ds) return true;   if(x.ds<y.ds) return false;//学号排序 if(x.no<y.no) return true;return false;
}

接下来给出最终的全部代码:可以发现简洁了太多了,累死累活搞快排、冒泡却只是一个cmp几句话的功夫。只能说人家库函数中提供的操作确实相当秀,使用这个排序操作,简直就和开挂差不多。


#include <iostream>
#include <cstring>
#include <algorithm>using namespace std;struct stu{int no;int ds;int cs;
}; bool cmp(stu x,stu y)
{//总分不同,按总分从大到小排序if(x.ds+x.cs > y.ds+y.cs)  return true;if(x.ds+x.cs < y.ds+y.cs)  return false;//总分相同,德分不同,按德分从大到小排序if(x.ds>y.ds) return true;if(x.ds<y.ds) return false;//德分相同,按学号从小到大排序 if(x.no<y.no) return true;return false;
}// int cmp(stu x,stu y)
// {
// 	  //总分不同,按总分从大到小排序
// 	  if(x.ds+x.cs > y.ds+y.cs)  return 1;
// 	  if(x.ds+x.cs < y.ds+y.cs)  return 0;
// 	  
//    //总分相同,德分不同,按德分从大到小排序
// 	  if(x.ds>y.ds) return 1;
// 	  if(x.ds<y.ds) return 0;
// 	 
//    //德分相同,按学号从小到大排序 
// 	  if(x.no<y.no) return 1;
//                        //if(x.no>y.no) return 0; 
// 	  return 0; //  } int main()
{stu *s = new stu[100000];int stu_num;int l;int h;// cin>>stu_num>>l>>h;scanf("%d %d %d",&stu_num,&l,&h);for(int i=0;i<stu_num;i++){//cin>>s[i].no>>s[i].ds>>s[i].cs;scanf("%d %d %d",&s[i].no,&s[i].ds,&s[i].cs);}int count_1 = 0;for(int i=0;i<stu_num;i++){if(s[i].ds>=l && s[i].cs>=l){count_1++;} }// cout<<count_1<<endl;printf("%d\n",count_1);//第一类 stu *s1 = new stu[100000];  int c1 = 0;//第二类stu *s2 = new stu[100000];int c2 = 0; //第三类stu *s3 = new stu[100000];int c3 = 0; //第四类stu *s4 = new stu[100000];int c4 = 0; for(int i=0;i<stu_num;i++){if(s[i].ds>=l && s[i].cs>=l){   //第一类 if(s[i].ds>=h && s[i].cs>=h){//	cout<<"都按总分 才德兼备:,之后若总分相同,德高先,若德同,考号小到大"<<s[i].no<<endl; s1[c1].no = s[i].no;s1[c1].ds = s[i].ds;s1[c1].cs = s[i].cs;c1++;}  //第二类 else if(s[i].ds>=h && s[i].cs<h){//cout<<"才不到,德到"<<endl;s2[c2].no = s[i].no;s2[c2].ds = s[i].ds;s2[c2].cs = s[i].cs;c2++;} //第三类else if(s[i].ds<h && s[i].cs<h && s[i].ds>=s[i].cs){//cout<<"才德均低,但德高才";s3[c3].no = s[i].no;s3[c3].ds = s[i].ds;s3[c3].cs = s[i].cs;c3++;}   //其他类 else{s4[c4].no = s[i].no;s4[c4].ds = s[i].ds;s4[c4].cs = s[i].cs;c4++; }} }sort(s1,s1+c1,cmp);for(int i=0;i<c1;i++){printf("%d %d %d\n",s1[i].no,s1[i].ds,s1[i].cs);}sort(s2,s2+c2,cmp);for(int i=0;i<c2;i++){printf("%d %d %d\n",s2[i].no,s2[i].ds,s2[i].cs);}sort(s3,s3+c3,cmp);for(int i=0;i<c3;i++){ printf("%d %d %d\n",s3[i].no,s3[i].ds,s3[i].cs);}sort(s4,s4+c4,cmp);for(int i=0;i<c4;i++){   printf("%d %d %d\n",s4[i].no,s4[i].ds,s4[i].cs);}}

 最终运行结果:

这篇关于PAT 1015 德才论(满分版)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/758363

相关文章

南卡科技“满分之选”全新开放式耳机发布,打造超越Pro的极致体验!

在音频技术的不断革新中,南卡品牌以其深厚的声学底蕴和对创新的不懈追求,再次为市场带来惊喜。今天,我们自豪地宣布,南卡OE Pro2开放式蓝牙耳机正式亮相,它不仅代表了南卡在开放式耳机领域的技术巅峰,更是对音质和佩戴舒适度的双重革新。 31°悬浮倾斜设计,无感佩戴的新高度 南卡OE Pro2将对耳机舒适性的诠释拉升到一个新境界,采用了开放式佩戴设计,彻底告别了传统耳机的堵塞感。基于上万耳

PAT甲级-1044 Shopping in Mars

题目   题目大意 一串项链上有n个钻石,输入给出每个钻石的价格。用m元买一个连续的项链子串(子串长度可为1),如果不能恰好花掉m元,就要找到最小的大于m的子串,如果有重复就输出多个,按递增顺序输出子串的前端和后端索引。 原来的思路 取连续的子串使和恰等于m,没有恰等于就找最小的大于。可以将子串依次累加,使得每个位置都是起始位置到该位置的序列和,整个数组显递增顺序,就可以用右边减左边

PAT (Advanced Level) Practice——1011,1012

1011:  链接: 1011 World Cup Betting - PAT (Advanced Level) Practice (pintia.cn) 题意及解题思路: 简单来说就是给你3行数字,每一行都是按照W,T,L的顺序给出相应的赔率。我们需要找到每一行的W,T,L当中最大的一个数,累乘的结果再乘以0.65,按照例子写出表达式即可。 同时还需要记录每一次选择的是W,T还是L

PAT (Advanced Level) Practice

1001:  题目大意: 计算 a+b 的结果,并以标准格式输出——即每三个数字一组,组之间用逗号分隔(如果数字少于四位,则不需要逗号分隔)  解析: 我们知道相加右正有负,对于样例来说 Sample Input: -1000000 9 Sample Output: -999,991 如果是从左往右,算上负号的话输出应该是-99,999,1 从右往左:-,999,991离正确

【第十三届蓝桥杯单片机国赛满分代码】

其他相关文章: 【提分必看!】蓝桥杯单片机提分技巧(国一经验分享) 【国一超全代码分享!】蓝桥杯单片机各模块代码整合 【蓝桥杯单片机客观题知识点汇总】 本代码经过编译后生成的hex文件经过了4T测试平台的满分测试。读者对代码有疑问的可以在评论区里提出。 主函数 #include "stdio.h"#include "intrins.h"#include "bsp_init.h"#i

GRE官方给出满分的ARGUMENT北美范文

下面是一篇GRE官方给出满分的ARGUMENT范文,我们来一起赏析,看看它为何能scored six (先读文章,再看我的点评   The following appeared as part of an article in a daily newspaper:   "Most companies would agree that as the risk of physical inju

GMAT数学满分多少?

自从GMAT考试改革后,很多同学就对GMAT数学满分是多少很是疑惑,本文就GMAT数学满分是多少的问题做解答,并就GMAT数学满分的实现提出几点建议,希望可以供大家参考,更好地备考。预祝大家取得理想的GMAT考试成绩。   GMAT数学满分51分。   GMAT数学满分备考建议:   1.先花一定的时间温习熟习数学术语,保证不会由于看不懂或了解错了标题而把标题做错了。   2.花一点时

GRE满分作文(北美范文)

GRE满分作文北美范文全揭秘。学习GMAT/GRE写作往往离不开“北美范文”,但其中良莠不齐,并非篇篇能称之为“范”,毕竟它们不是ACT/ETS所钦定的文章。如此说来,Official Guide上的范文就弥足珍贵,无论6分的还是5分、4分的都要仔细分析,尤其是其中所给与的分析和评论更是要细细体味,领悟其精神,然后用心实践。   下面是一篇官方给出满分的ARGUMENT范文,我们来一起赏析,

备考GMAT数学满分的方法

对于很多人而言,GMAT数学满分是唯一的要求,诚然,GMAT数学并不难,但是要想拿到GMAT数学满分,考生还是要注意一些问题的,下面就来看看小编为大家收集的GMAT数学满分实现之旅,希望对大家有所帮助,文中观点仅供参考。   GMAT数学满分最高原则:   1、做错一定是没有考虑周到;   2、看起来无关的条件和选项,其实有关;   3、注意ETS千方百计在考你,它们老JIAN巨猾。

SAT数学满分需要克服的3个问题

SAT数学满分成绩对于中国考生来说是一个可以实现的目标,但是想要拿到这个成绩,考生需要在备考的时候克服一些问题。那么究竟是什么问题阻碍了大家取得SAT数学满分成绩呢?下面我们来看看详细内容吧。   很多没有拿到SAT数学满分成绩的考生在回答为什么时,答案十有八九是“粗心”。粗心从来都只是借口,只有深入挖掘出错的真正原因,才能避免错误的再次出现。   SAT 数学常见错误原因如下:   1