首页 > 其他分享 >P1012 [NOIP1998 提高组] 拼数

P1012 [NOIP1998 提高组] 拼数

时间:2024-02-19 14:46:59浏览次数:24  
标签:return 拼数 int P1012 stu student NOIP1998 include cmp

题目

 源代码

一、错误示范

 1 //去比较最高位数字的大小,大的在前面(ASCII比较)
 2 //使用字符串存储多个数字
 3 #include <iostream>
 4 #include <algorithm>
 5 using namespace std;
 6 struct stu
 7 {
 8     string s;
 9 }student[25];
10 bool cmp(stu a,stu b)
11 {
12     return a.s>b.s; //不能直接这么写,有些数据会出错
13     //return a.s+b.s>b.s+a.s;
14 }
15 int main()
16 {
17     int n;
18     cin>>n;
19     for(int i=1;i<=n;i++)
20     {
21         cin>>student[i].s;
22     }
23     sort(student+1,student+1+n,cmp);
24     for(int i=1;i<=n;i++)
25     {
26         cout<<student[i].s;
27     }
28     return 0;
29 }

得分情况:

 二、正确答案

 1 //去比较最高位数字的大小,大的在前面(ASCII比较)
 2 //使用字符串存储多个数字
 3 #include <iostream>
 4 #include <algorithm>
 5 using namespace std;
 6 struct stu
 7 {
 8     string s;
 9 }student[25];
10 bool cmp(stu a,stu b)
11 {
12     //return a.s>b.s; //不能直接这么写,有些数据会出错
13     return a.s+b.s>b.s+a.s;
14 }
15 int main()
16 {
17     int n;
18     cin>>n;
19     for(int i=1;i<=n;i++)
20     {
21         cin>>student[i].s;
22     }
23     sort(student+1,student+1+n,cmp);
24     for(int i=1;i<=n;i++)
25     {
26         cout<<student[i].s;
27     }
28     return 0;
29 }

感悟:两份源代码的区别在十二三行的cmp函数中    错误的是return a.s>b.s             正确的是a.s+b.s>b.s+a.s

错误数据为:

例:当比较"10"和"100"时,错误案例中的cmp的结果是10<100-------因此组装出来的数字为10010(先比较再拼接)

               正确答案中cmp是将组装后的字符串进行比较 也就是将10100和10010比较,得到前者(10100)     (先拼接再比较)

总结:先拼接再比较符合所有数据的情况,而先比较的话,有一部分数据不符合

标签:return,拼数,int,P1012,stu,student,NOIP1998,include,cmp
From: https://www.cnblogs.com/lian369/p/18021047

相关文章

  • P1011 [NOIP1998 提高组] 车站
    题目描述火车从始发站(称为第11站)开出,在始发站上车的人数为aa,然后到达第22站,在第22站有人上、下车,但上、下车的人数相同,因此在第22站开出时(即在到达第33站之前)车上的人数保持为aa人。从第33站起(包括第33站)上、下车的人数有一定规律:上车的人数都是前两站上车人数......
  • P1012 [NOIP1998 提高组] 拼数
    [NOIP1998提高组]拼数题目描述设有\(n\)个正整数\(a_1\dotsa_n\),将它们联接成一排,相邻数字首尾相接,组成一个最大的整数。输入格式第一行有一个整数,表示数字个数\(n\)。第二行有\(n\)个整数,表示给出的\(n\)个整数\(a_i\)。输出格式一个正整数,表示最大的整数样......
  • P10125 「Daily OI Round 3」Simple题解
    原题传送门题目概述:给我们一个字符串,不区分大小写,让我们判断此字符串是与Acoipp等价,还是与Svpoll等价,或者是与前两者都不等价,并按题目条件输出。思路分析:我们只需要把此字符串的第一个字符转成大写,其他字符转成小写,并与那两个字符串进行比较就行了代码:#include<bits/st......
  • P10125 「Daily OI Round 3」Simple 题解
    题目传送门简单模拟,主要考察字符串。首先输入一个char类型的数组,然后直接遍历每一位是否为Acoipp或Svpoll即可。//Simple//codeby:cq_irritater//time:2024/02/04#include<bits/stdc++.h>usingnamespacestd;chara[10];intmain(){//freopen("c......
  • 洛谷题单指南-排序-P1012 [NOIP1998 提高组] 拼数
    原题链接:https://www.luogu.com.cn/problem/P1012题意解读:通过某种合理的排序方式,使得排序后的数字连在一起最大。解题思路:此题关键在于排序,对于两个数字,哪个数字应该排在前面呢?1、思考误区很容易想到,给定两个数abcd、xyz,先比较第一位a和x,谁大谁排前面,一直到c和z。再来看d,这......
  • [NOIP1998 普及组] 三连击
    [NOIP1998普及组]三连击题目背景本题为提交答案题,您可以写程序或手算在本机上算出答案后,直接提交答案文本,也可提交答案生成程序。题目描述将共个数分成组,分别组成个三位数,且使这个三位数构成的比例,试求出所有满足条件的个三位数。输入格式无输出格式若干行,每行个......
  • P1010 [NOIP1998 普及组] 幂次方(十进制转二进制)(递归)
    P1010[NOIP1998普及组]幂次方个人感想终于能真正自主解决一道纯递归题目了,完成前面那次P1928外星密码的遗憾了十进制转化二进制再处理也顺利搞定(之前洛谷月赛就有相似题目,当时觉得很难就没写,太亏了)十进制转二进制样例:inta[]while(n!=0){ if(n%2==1){ a......
  • [NOIP1998 普及组] 阶乘之和
    [NOIP1998普及组]阶乘之和题目描述用高精度计算出()。其中!表示阶乘,定义为。例如,。输入格式一个正整数。输出格式一个正整数,表示计算结果。样例#1样例输入#13样例输出#19提示【数据范围】对于的数据,。【其他说明】注,《深入浅出基础篇》中使用本题作为例题,但是其数据范围......
  • (C语言)1到50的阶乘之和列表,参考用,洛谷:P1009 [NOIP1998 普及组] 阶乘之和
    1到50列表,阶乘之和S=1!+2!+3!+⋯+n!(n≤50)1::12::33::94::335::1536::8737::59138::462339::40911310::403791311::4395471312::52295631313::674997711314::9392826831315::140160263631316::2232439252431317::37801182062031318::678038552634831319::12842......
  • P1009 [NOIP1998 普及组] 阶乘之和
    题目描述用高精度计算出 S=1!+2!+3!+\cdots+n!S=1!+2!+3!+⋯+n!(n\le50n≤50)。其中 ! 表示阶乘,定义为 n!=n\times(n-1)\times(n-2)\times\cdots\times1n!=n×(n−1)×(n−2)×⋯×1。例如,5!=5\times4\times3\times2\times1=1205!=5×4×3×2×1=......