当前位置 博文首页 > ljmhxs的博客:刷刷题(题解)

    ljmhxs的博客:刷刷题(题解)

    作者:[db:作者] 时间:2021-08-19 13:35

    题目描述

    聪明的你刚开始学习信息学竞赛,每天很认真的在OJ上刷题。

    Mr.Chen在查看你在OJ上AC题的列表时,发现OJ出现问题,所有题目编号均打乱顺序,并有重复,但Mr.Chen想看看你究竟AC了多少题。

    输入格式

    由一个空格隔开,乱序且有重复的题目编号(P加四位数字 如”P1001”) 文件结尾除一个换行符外无任何字符。

    输出格式

    第一行,你总共AC 题目个数;

    第二行,经过排序且无重复的题目编号列表(四个一排,行末无空行);

    样例

    样例输入1

    P1049 P1050 P1065 P1088 P1090 P1093 P1103 P1008 P1026 P1028 P1130 P1171 P1197 P1025 P1029 P1030 P1033 P1394 P1395 P1396 P1397 P1503 P1913 P1000 P1005 P1006 P1010 P1011 P1012 P1013 P1009 P1014 P1117 P1127 P1129 P1007 P1015 P1016 P1017 P1018 P1022 P1023 P1078 P1001 P1002 P1003 P1004 P1019 P1020 P1021 P1024 P1077 P1066 P1076 P1079 P1080 P1084 P1087 P1104 P1105 P1108 P1015 P1016 P1017 P1018 P1022 P1023 P1078 P1001 P1002 P1003 P1004 P1019 P1020 P1021 P1024 P1077 P1066 P1076 P1079 P1080 P1084 P1087 P1104 P1105 P1108
    

    样例输出1

    61
    P1000 P1001 P1002 P1003
    P1004 P1005 P1006 P1007
    P1008 P1009 P1010 P1011
    P1012 P1013 P1014 P1015
    P1016 P1017 P1018 P1019
    P1020 P1021 P1022 P1023
    P1024 P1025 P1026 P1028
    P1029 P1030 P1033 P1049
    P1050 P1065 P1066 P1076
    P1077 P1078 P1079 P1080
    P1084 P1087 P1088 P1090
    P1093 P1103 P1104 P1105
    P1108 P1117 P1127 P1129
    P1130 P1171 P1197 P1394
    P1395 P1396 P1397 P1503
    P1913
    

    数据范围与提示

    对于10%的数据 题号无重复

    对于40%的数据 输入列表中题目个数<=10000

    对于60%的数据 输入列表中题目个数<=100000

    对于100%的数据 输入列表中题目个数<=1000000

    分类标签

    排序 桶排序

    题解

    这道题的意思是:让你把他毫无头绪(无顺序)的刷过的题,并且提交了好多次才过的题(有重复)排序输出(从小到大分别输出无重复的)(还要输出他刷的题的数量)

    首先是输入问题

    do_while循环来输入数据循环条件是,输入的第一个字符不是"P",循环内部是输入"P"之后的四个数字:

    do {
    	cin>>ch;
    	cin>>a[n];
        n++;
    }while(scanf("%c",&ch)!=-1);

    但是可以优化,因为但你输入完毕后,还需要桶排序的循环,所以可以再输入这里顺便排序掉:

    do {
    	cin>>ch;
    	cin>>a;
    	if(f[a]==0) cnt++; f[a]=1;  //顺便记录AC题目个数
    }while(scanf("%c",&ch)!=-1);

    然后就是循环遍历一遍,看看是否有标记的题目,如果是的话分两种情况:

    1.一行够四个输出? ? ? 2.一行不够四个输出

    首先输出P再输出i

    ?
    for (int i = 1000; i <= 9999; i++) {
        if (f[i] == 1) {
            if (n % 4 == 0)
                cout << 'P' << i << endl;
            else
                cout << 'P' << i << " ";
            n++;
        }
    }

    但是这样输出是不行的,因为输入四位数时,可能是0001,这时a最终存储为1,而从1000开始循环是找不见的,从0开始更不行,这是就要分类了:代码如下

    for(int i=0;i<=9999;i++){
    	if(f[i]==1){
    		if(n%4==0) {
    			cout<<'P';
    			if(i<10) cout<<"000";
    			else if(i<100) cout<<"00";
    			else if(i<1000) cout<<"0"; 
    			cout<<i<<endl;
    		}
    		else {
    			cout<<'P';
    			if(i<10) cout<<"000";
    			else if(i<100) cout<<"00";
    			else if(i<1000) cout<<"0";
    			cout<<i<<" ";
    		}
    		n++;
    	}
    }

    这样就将0001之类的可能解决掉了。

    所有代码(未AC):

    #include <bits/stdc++.h>
    using namespace std;
    int a;
    char ch;
    bool f[10005];
    int n=1,x,cnt;
    int main(){
    	do {
    		cin>>ch;
    		cin>>a;
    		if(f[a]==0) cnt++; f[a]=1;
    	}while(scanf("%c",&ch)!=-1);
    	cout<<cnt<<endl;
    	n=1;
    	for(int i=0;i<=9999;i++){
    		if(f[i]==1){
    			if(n%4==0) {
    				cout<<'P';
    				if(i<10) cout<<"000";
    				else if(i<100) cout<<"00";
    				else if(i<1000) cout<<"0"; 
    				cout<<i<<endl;
    			}
    			else {
    				cout<<'P';
    				if(i<10) cout<<"000";
    				else if(i<100) cout<<"00";
    				else if(i<1000) cout<<"0";
    				cout<<i<<" ";
    			}
    			n++;
    		}
    	}
    	return 0;
    }

    但是

    发现有一个点没有过!!!

    那正是

    没有输入,只需要在输入时加一个条件判断:

    if(ch==0){
    	cout<<0;
    	return 0;
    }

    所以AC代码:

    #include <bits/stdc++.h>
    using namespace std;
    int a;
    char ch;
    bool f[10005];
    int n=1,x,cnt;
    int main(){
    	do {
    		cin>>ch;
    		if(ch==0){
    			cout<<0;
    			return 0;
    		}
    		cin>>a;
    		if(f[a]==0) cnt++; f[a]=1;
    	}while(scanf("%c",&ch)!=-1);
    	cout<<cnt<<endl;
    	n=1;
    	for(int i=0;i<=9999;i++){
    		if(f[i]==1){
    			if(n%4==0) {
    				cout<<'P';
    				if(i<10) cout<<"000";
    				else if(i<100) cout<<"00";
    				else if(i<1000) cout<<"0"; 
    				cout<<i<<endl;
    			}
    			else {
    				cout<<'P';
    				if(i<10) cout<<"000";
    				else if(i<100) cout<<"00";
    				else if(i<1000) cout<<"0";
    				cout<<i<<" ";
    			}
    			n++;
    		}
    	}
    	return 0;
    }
    //rp++      AC!!! 

    点赞你要亮,关注干得漂亮

    不关注点赞你就别走(好像我也留不住)

    那就要个点赞吧(要求不大吧)

    每天必须日更!!(绝对不可能)看不见我

    cs
    下一篇:没有了