刷刷题(题解)

题目描述

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

chen_zhe在查看你在OJ上AC题的列表时,发现OJ出现问题,所有题目编号均打乱顺序,并有重复,但chen_zhe想看看你究竟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,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!!! 

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

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

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

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

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值