考察:考場(chǎng)內(nèi)排序李滴,考場(chǎng)外又排序一次,兩次排序
learn && wrong:
1测摔、考場(chǎng)號(hào)置為i就行了置济,而不是人數(shù),第二個(gè)輸入數(shù)字是人數(shù)锋八,你搞錯(cuò)了
2浙于、結(jié)構(gòu)體名字跟結(jié)構(gòu)體數(shù)組名字沖突了,cmp做參數(shù)就不知道哪一個(gè)了
3挟纱、sort函數(shù)可以對(duì)二維數(shù)組用行排列
4羞酗、得出序號(hào),第一個(gè)設(shè)置序號(hào)設(shè)置為1紊服,借來(lái)for循環(huán)檀轨,如果相同,則與前一個(gè)相同欺嗤,不同則下標(biāo)+1
5参萄、結(jié)構(gòu)體不設(shè)排序號(hào),直接輸出排序號(hào)剂府,就是設(shè)一個(gè)變量+一個(gè)循環(huán)
id(i > 0 && stu[i].score != stu[i - 1].score){
r = i + 1;
}
//pritnf之類或者stu[i].r = r拧揽;
6、這招不錯(cuò)腺占,頂一個(gè)int型變量淤袜,沒(méi)讀入一個(gè)考生,就讓num自增衰伯,當(dāng)讀取完一個(gè)考場(chǎng)的考生信息铡羡,(假設(shè)該考場(chǎng)有k個(gè)考生)后,這個(gè)考場(chǎng)的考生所對(duì)應(yīng)的數(shù)組下標(biāo)區(qū)間為【num - k意鲸,num)
輸入:
1烦周、考場(chǎng)數(shù)
2、考場(chǎng)人數(shù)
3怎顾、考生號(hào)+分?jǐn)?shù)(13位+0~100分
考場(chǎng)小于100個(gè)读慎,每個(gè)考場(chǎng)小于300人
輸出:
registration_number final_rank location_number local_rank
以分?jǐn)?shù)排序,如果分?jǐn)?shù)相同槐雾,則考生號(hào)以字典序小的排序
同樣分?jǐn)?shù)同樣內(nèi)的排名
編程思想:
1夭委、結(jié)構(gòu)體數(shù)組:準(zhǔn)考證,分?jǐn)?shù)募强,考場(chǎng)號(hào)株灸,考場(chǎng)內(nèi)的排名崇摄,總排名,30010個(gè)慌烧,
輸入考場(chǎng)號(hào)逐抑,然后輸入每個(gè)考場(chǎng)內(nèi)考生,注意把結(jié)構(gòu)體數(shù)組標(biāo)記考場(chǎng)號(hào)
然后排序考場(chǎng)內(nèi)的
2屹蚊、
再排序總的厕氨,然后輸出總的,輸出各項(xiàng)數(shù)據(jù)
注意:因?yàn)槎S數(shù)組不知道如何給序號(hào)淑翼,所以整個(gè)復(fù)制過(guò)來(lái)再排序
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
struct student{
char id[15];//考生號(hào)
int score; //分?jǐn)?shù)
int test_location;//考場(chǎng)號(hào)
int local_rank; //考場(chǎng)內(nèi)排名
int final_rank; //總排名
}stu[101][301], stu1[30001]; //前面考場(chǎng)號(hào)腐巢,后面考生號(hào)比較好!
bool cmp(student a, student b) { //比較函數(shù),按分?jǐn)?shù)排名玄括,如果相同冯丙,則按字典序從大到小 (!T饩N赶А)名詞跟數(shù)組名字沖突了
if (a.score != b.score) return a.score > b.score;
else return strcmp(a.id, b.id) < 0;
}
int main()
{
int total;
cin >> total; //幾個(gè)考場(chǎng)
//int sum = 0; 統(tǒng)計(jì)總?cè)藬?shù)
int sum[101];//累計(jì)總?cè)藬?shù)數(shù)組
for (int i = 0;i < total;++i) { //(!!!)太笨了,用一個(gè)循環(huán)澳牡瘛船殉!
int local;
cin >> local; //人數(shù)
//sum += local; 每次輸入人數(shù)還要累加總?cè)藬?shù),不能這么做,用一個(gè)數(shù)組來(lái)把每個(gè)考場(chǎng)的人數(shù)添加進(jìn)來(lái)
sum[i] = local;
for (int j = 0;j < local;++j) {
cin >> stu[i][j].id >> stu[i][j].score; //輸入id和分?jǐn)?shù)
stu[i][j].test_location = i + 1; //修改考場(chǎng)號(hào)
}
sort(stu[i], stu[i] + local, cmp);//考場(chǎng)內(nèi)排序 (!!!)應(yīng)該可以的
stu[i][0].local_rank = 1; //(!!!)得出考場(chǎng)內(nèi)排名斯嚎,注意利虫,排序跟得出序號(hào)是完全不一樣的
for (int k = 1;k < local;k++) {
//(!!!)得出排名的第一步,一定要弄第一個(gè)為1堡僻,然后k = 1開(kāi)始
if (stu[i][k].score == stu[i][k - 1].score) {
stu[i][k].local_rank = stu[i][k - 1].local_rank;
}
else {
stu[i][k].local_rank = k + 1; //(!!!)注意是k + 1;
}
}
}
int sum1 = 0;
for (int i = 0;i < total;i++){ //累計(jì)總?cè)藬?shù)
sum1 += sum[i];
}
//總排名的排序來(lái)一次,仍舊是糠惫,然后排名怎么弄,算了我直接再開(kāi)一個(gè)數(shù)組好了钉疫,然后復(fù)制過(guò)來(lái)...
/* 這個(gè)排序是錯(cuò)的硼讽!
sort(student, student + sum1;cmp); //總的排序
student[0][0].final_rank = 1;
int z = 0;
for (int j = 1;j < sum[j];++j) { //(!I蟆9谈蟆)新花樣,雙重?cái)?shù)組的排名,有點(diǎn)區(qū)別城菊,應(yīng)該讓第一排單獨(dú)一個(gè)循環(huán)备燃,然后之后就是雙重循環(huán)了
if (student[z][j] == student[z][j - 1]) {
student[z][j].final_rank = student[z].final_rank;
}else{
student[z][j].final_rank = j + 1;
}
}
++z;
for (; z < total;z++) { //(!!!)總的排序我不會(huì)。凌唬。赚爵。、
for(int j = 0;)
}
*/
int num = 0; //整個(gè)復(fù)制過(guò)來(lái),并且總?cè)藬?shù)也知道了
for (int i = 0;i < total;++i) {
for (int j = 0;j < sum[i];++j) {
stu1[num++] = stu[i][j];
}
}
printf("%d\n", num); //輸出人數(shù)
sort(stu1, stu1 + num,cmp);
int r = 1;
for (int i = 0;i < num;i++) { //(!!!)不修改排名直接輸出冀膝,也不錯(cuò)
if (i > 0 && stu1[i].score != stu1[i - 1].score) {
r = i + 1; //當(dāng)前考生與上一個(gè)考生分?jǐn)?shù)不同時(shí),讓r更新為人數(shù)+1
}
printf("%s ", stu1[i].id);
printf("%d %d %d\n", r, stu1[i].test_location, stu1[i].local_rank);
}
return 0;
}