日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

信息学奥赛一本通 1182:合影效果 | OpenJudge NOI 1.10 07:合影效果

發布時間:2025/3/17 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 信息学奥赛一本通 1182:合影效果 | OpenJudge NOI 1.10 07:合影效果 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

【題目鏈接】

ybt 1182:合影效果
OpenJudge NOI 1.10 07:合影效果

【題目考點】

1. 排序

【君義精講】排序算法

【解題思路】

解法1:將男生身高和女生身高分別排序

將男生身高和女生身高分別存在兩個不同的數組中,男生升序排序,女生降序排序,分別輸出。

解法2:整合為一個比較條件

設函數判斷兩個學生哪個應該排在前面

  • 如果一個是男生一個是女生,男生排在前面
  • 如果都是男生,身高更矮的排在前面
  • 如果都是女生,身高更高的排在前面

這樣就得到了一個比較條件。用這個比較條件去做排序即可。
數據只有40個,用什么排序方法都可以。

【題解代碼】

解法1:將男生身高和女生身高分別排序

  • 使用STL sort函數排序
#include <bits/stdc++.h> using namespace std; bool cmpUp(double a, double b)//升序 {return a < b; } bool cmpDown(double a, double b)//降序 {return a > b; } int main() {char s[10];//保存性別字符串 double a, male[45], female[45];int n, mi = 0, fi = 0;//mi:male中元素個數 fi:female中元素個數 cin >> n;for(int i = 1; i <= n; ++i){cin >> s >> a;if(s[0] == 'm')male[++mi] = a;elsefemale[++fi] = a;}sort(male+1, male+1+mi, cmpUp);//男生升序排序 sort(female+1, female+1+fi, cmpDown);//女生降序排序for(int i = 1; i <= mi; ++i)cout << fixed << setprecision(2) << male[i] << ' ';for(int i = 1; i <= fi; ++i)cout << fixed << setprecision(2) << female[i] << ' '; return 0; }
  • 插入排序+scanf、printf
#include <bits/stdc++.h> using namespace std; int main() {char s[10];//保存性別字符串 double a, male[45], female[45];int n, mi = 0, fi = 0;//mi:male中元素個數 fi:female中元素個數 scanf("%d", &n);for(int i = 1; i <= n; ++i){scanf("%s %lf", s, &a);if(s[0] == 'm'){male[++mi] = a;for(int j = mi; j > 1; --j){if(male[j] < male[j-1])//男生升序排序 swap(male[j], male[j-1]);elsebreak;}}else{female[++fi] = a;for(int j = fi; j > 1; --j){if(female[j] > female[j-1])//女生降序排序swap(female[j], female[j-1]);elsebreak;}}}for(int i = 1; i <= mi; ++i)printf("%.2f ", male[i]);for(int i = 1; i <= fi; ++i)printf("%.2f ", female[i]);return 0; }

解法2:整合為一個比較條件

  • 使用STL sort函數 + 重載<運算符
#include <bits/stdc++.h> using namespace std; struct Stu {char s[15];//性別 double h;//身高bool operator < (const Stu &b) const//返回自身是否應該排在b的前面 {if(s[0] == 'm' && b.s[0] == 'm')//都是男生,更矮的在前面 return h < b.h;else if(s[0] == 'f' && b.s[0] == 'f')//都是女生,更高的排在前面return h > b.h;else//一男一女 return s[0] == 'm';//如果本身是男生,自己應該排在前面,返回真。如果本身不是男生,自己不該排在前面,返回假。 } }; int main() {Stu a[45];int n;cin >> n;for(int i = 1; i <= n; ++i)cin >> a[i].s >> a[i].h;sort(a+1, a+1+n);for(int i = 1; i <= n; ++i)cout << fixed << setprecision(2) << a[i].h << ' '; return 0; }
  • 使用冒泡排序 判斷條件寫成表達式
#include <bits/stdc++.h> using namespace std; struct Stu {char s[15];//性別 double h;//身高 }; int main() {Stu a[45];int n;cin >> n;for(int i = 1; i <= n; ++i)cin >> a[i].s >> a[i].h;for(int i = 1; i <= n-1; ++i)//冒泡排序 for(int j = 1; j <= n-i; ++j)if(a[j].s[0] == 'm' && a[j+1].s[0] == 'm' && a[j].h > a[j+1].h ||//都是男生,更矮的在前面 a[j].s[0] == 'f' && a[j+1].s[0] == 'f' && a[j].h < a[j+1].h ||//都是女生,更高的排在前面a[j].s[0] == 'f' && a[j+1].s[0] == 'm')//性別不同,男在前女在后swap(a[j], a[j+1]);for(int i = 1; i <= n; ++i)cout << fixed << setprecision(2) << a[i].h << ' '; return 0; }

總結

以上是生活随笔為你收集整理的信息学奥赛一本通 1182:合影效果 | OpenJudge NOI 1.10 07:合影效果的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。