本题要求获得成绩从高到低或从低到高的排列,相同成绩都按先录入排列在前的规则处理。这里我使用了一个id标识符,表示输入顺序。
#include
#include
using namespace std;
struct student {
char name[20];
int id; //输入顺序
int score;
};
bool cmp0(struct student a, struct student b) {
if (a.score != b.score) return a.score > b.score;
else return a.id < b.id; //相同成绩按先录入排列在前
}
bool cmp1(struct student a, struct student b) {
if (a.score != b.score) return a.score < b.score;
else return a.id < b.id; //相同成绩按先录入排列在前
}
int main() {
int n;
while (scanf("%d", &n) != EOF) {
int method;
scanf("%d", &method);
//getchar();
struct student std[n];
for (int i = 0; i < n; i++) {
std[i].id = i + 1;
scanf("%s%d", std[i].name, &std[i].score);
}
if (method) {
sort(std, std + n, cmp1); //升序
} else {
sort(std, std + n, cmp0); //降序
}
for (int i = 0; i < n; i++) {
printf("%s %d\n", std[i].name, std[i].score);
}
}
return 0;
}
CodeUp应该也做过的题目。
#include
#include
#include
using namespace std;
int main() {
char s[250];
while (gets(s)) {
int len = strlen(s);
sort(s, s + len);
puts(s);
}
return 0;
}
CodeUp做过的题目。发现好些地方不太一样,提交了好几次才通过?……
0 3
,有两个输入,牛客网没有给出结束的示例,不太清楚。while (scanf("%d%d", &N, &C), N) {...}
的结构可以通过,但在牛客网上面没有通过,未能在规定时间内运行结束,需要写成while (scanf("%d", &n) != EOF && n)
的结构。#include
#include
#include
using namespace std;
struct student {
int id;
char name[12];
int grade;
} stu[100050];
bool cmp1(struct student a, struct student b) {
return a.id < b.id;
}
bool cmp2(struct student a, struct student b) {
int t = strcmp(a.name, b.name);
if (t != 0) return t < 0;
else return a.id < b.id;
}
bool cmp3(struct student a, struct student b) {
if (a.grade != b.grade) return a.grade < b.grade;
else return a.id < b.id;
}
int main() {
int n, c;
while (scanf("%d", &n) != EOF && n) {
scanf("%d", &c);
for (int i = 0; i < n; i++) {
scanf("%d%s%d", &stu[i].id, stu[i].name, &stu[i].grade);
}
switch (c) {
case 1: sort(stu, stu + n, cmp1); break;
case 2: sort(stu, stu + n, cmp2); break;
case 3: sort(stu, stu + n, cmp3); break;
}
printf("Case:\n");
for (int i = 0; i < n; i++) {
printf("%06d %s %d\n", stu[i].id, stu[i].name, stu[i].grade);
}
}
return 0;
}
第一次发现竟然没有一个通过的……惊了,还以为我冒泡排序都会写错……结果发现格式不对劲,题中要求对于每组数据,将排序后的n个整数输出,每个数后面都有一个空格。每组测试数据的结果占一行。
我少输出了结尾的空格?……题目中的n(1<=n<=100),使用冒泡排序达到万级别,没有超出百万级别达到千万级别,因此是可行的。
/* 1.1 */
#include
int main() {
int n;
while (scanf("%d", &n) != EOF) {
int a[n];
for (int i = 0; i < n; i++) {
scanf("%d", &a[i]);
}
for (int i = n - 1; i >= 0; i--) {
int flag = 0;
for (int j = 0; j < i; j++) {
if (a[j] > a[j + 1]) {
int temp = a[j];
a[j] = a[j + 1];
a[j + 1] = temp;
flag = 1;
}
}
if (flag == 0) break;
}
for (int i = 0; i < n; i++) {
printf("%d ", a[i]);
}
printf("\n");
}
return 0;
}
如果修改n的范围,使其最大能够达到10000,那么冒泡排序就已经超过了百万数量级(10000*10000)而不应该被采用,我们需要使用快排、归并排序等O(nlogn)的算法,这里不要求我们手写,可以直接调用C++的库函数。
/* 1.2 */
#include
#include
using namespace std;
int main() {
int n;
while (scanf("%d", &n) != EOF) {
int a[n];
for (int i = 0; i < n; i++) {
scanf("%d", &a[i]);
}
sort(a, a + n);
for (int i = 0; i < n; i++) {
printf("%d ", a[i]);
}
printf("\n");
}
return 0;
}
CodeUp做过的题目,只不过在牛客网才发现原来是华科以前的题目啊。
#include
#include
using namespace std;
int main() {
int n;
while (scanf("%d", &n) != EOF) {
int a[n];
for (int i = 0; i < n; i++) {
scanf("%d", &a[i]);
}
if (n == 1) {
printf("%d\n-1\n", a[0]);
continue;
}
int max = 0;\
for (int i = 1; i < n; i++) {
if (a[i] > a[max]) max = i;
}
sort(a, a + n);
printf("%d\n", a[n - 1]);
for (int i = 0; i < n - 1; i++) {
printf("%d", a[i]);
if (i < n - 2) printf(" ");
else printf("\n");
}
}
return 0;
}