本文主要是介绍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 德才论(满分版)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!