pat题目部分正确,求解答

妖__ING 2015-11-02 06:09:50
1023. 组个最小数 (20)

时间限制
100 ms
内存限制
65536 kB
代码长度限制
8000 B
判题程序
Standard
作者
CAO, Peng
给定数字0-9各若干个。你可以以任意顺序排列这些数字,但必须全部使用。目标是使得最后得到的数尽可能小(注意0不能做首位)。例如:给定两个0,两个1,三个5,一个8,我们得到的最小的数就是10015558。

现给定数字,请编写程序输出能够组成的最小的数。

输入格式:

每个输入包含1个测试用例。每个测试用例在一行中给出10个非负整数,顺序表示我们拥有数字0、数字1、……数字9的个数。整数间用一个空格分隔。10个数字的总个数不超过50,且至少拥有1个非0的数字。

输出格式:

在一行中输出能够组成的最小的数。

输入样例:
2 2 0 0 0 3 0 0 1 0
输出样例:
10015558


#include<iostream>
#include<string>
#include<sstream>
using namespace std;
string convert(int length,int *a)
{
string s,temp;
stringstream s1;
for(int i = 0;i<length;i++)
{
s1<<a[i];
s1>>temp;
s1.clear();
s+=temp;

}
return s;

}
void print(int length,int *a)
{
for(int i = 0;i<length;i++)
{
cout<<a[i];

}

}
int main()
{
char a[10];
int b = 10,temp;
string c,s;
cin>>a[0]>>a[1]>>a[2]>>a[3]>>a[4]>>a[5]>>a[6]>>a[7]>>a[8]>>a[9];
stringstream stream;
for(int i = 0;i<10;i++)
{
for(int j =a[i]-'0';j>0;j--)
{
stream<<(i);
stream>>c;
stream.clear();
s+=c;
}
}
for(int i=1;i<s.size();i++)
{
for(int j =s.size()-1;j>=i;j--)
{
if(s[j]<s[j-1])
{
temp = s[j];
s[j] = a[j-1];
s[j-1] = temp;
}
}
}

int count=0;

for(int i = 0;i<s.size();i++)
{
if('0' == s[i])
count++;
}

string s1 = s.substr(0,count);
string s2 = s.substr(count,1);
string s3 = s.substr(count+1,s.size()-count);
string s_sum = s2+s1+s3;
cout<<s_sum<<endl;
return 0;
}


时间 结果 得分 题目 语言 用时(ms) 内存(kB) 用户
11月02日 17:14 部分正确 2 1023 C++ (g++ 4.7.2) 1 372
测试点

测试点 结果 用时(ms) 内存(kB) 得分/满分
0 答案错误 1 256 0/12
1 答案错误 1 364 0/2
2 答案错误 1 236 0/2
3 答案正确 1 372 2/2
4 异常退出 1 256 0/2

请问为什么结果部分正确
...全文
381 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
fly_dragon_fly 2015-11-03
  • 打赏
  • 举报
回复
直接输出吧, 不需要string
int cnt[10];
int main()
{
    while(1){
        for(int i=0;i<10;i++) if(!(cin>>cnt[i])) break;
        for(int i=1;i<10;i++) if(cnt[i]) {
            --cnt[i];
            cout<<(char)(i+'0');
            break;
        }
        for(int i=0;i<10;i++) for(;cnt[i];--cnt[i]) cout<<char(i+'0');
        cout<<endl;
    }
    return 0;
}
攻城狮凌风 2015-11-02
  • 打赏
  • 举报
回复
看作者在用string,好吧给你想要的答案。
# include <iostream>
#include"string"
using namespace std;
int main()
{
	static int counter[10];//设置计数器
	int i;

	for(i=0;i<10;i++)
		cin>>counter[i];

	//考虑存在‘0’的情况
	i=1;
	string s;
	if(counter[0]){
		while(counter[i]==0&&i<10)
			i++;
		if(i==10){//只有‘0’的情况
			s+='0';
			return 0;
		}
		else{
			counter[i]--;
			s+=(char)(i+'0');
		}
	}

	//双重遍历输出
	for(i=0;i<10;i++)
		for(int j=counter[i];j>0;j--)
				s+=(char)(i+'0');

	cout<<s<<endl;
    return 0;
}
攻城狮凌风 2015-11-02
  • 打赏
  • 举报
回复
再说一遍,不要排序,没有必要用任何排序!
攻城狮凌风 2015-11-02
  • 打赏
  • 举报
回复
好吧,我写个最简单的。不用使用任何排序。辅助内存可以忽略,复杂度为O(N), N为所有数的个数之和。 本质上是按照从小到大的顺序将统计的个数依次输出即可,假设只有1 2 3且个数依次为3 1 2.则毫无疑问最小的数是 111233,结果为双重循环输出的结果。若有0,如只有0 1 2 3,且个数依次为 2 3 1 2,则第一个设置为不为0的最小的数且将该数的计数减去1,然后再一次完全输出。输出即为 10011233 (1)设置计数器输入各个数(0---9)的个数 (2)若0不包括,则使用双重遍历输出即可 若包括,从小到大找出第一个计数不为0的数并输出且对其计数减一,再使用双重遍历输出 代码:
# include <iostream>
using namespace std;
int main()
{
	static int counter[10];//设置计数器
	int i;

	for(i=0;i<10;i++)
		cin>>counter[i];

	//考虑存在‘0’的情况
	i=1;
	if(counter[0]){
		while(counter[i]==0&&i<10)
			i++;
		if(i==10){//只有‘0’的情况
			cout<<'0'<<endl;
			return 0;
		}
		else{
			counter[i]--;
			cout<<(char)(i+'0');
		}
	}

	//双重遍历输出
	for(i=0;i<10;i++)
		for(int j=counter[i];j>0;j--)
			cout<<(char)(i+'0');

	cout<<endl;
    return 0;
}
ID870177103 2015-11-02
  • 打赏
  • 举报
回复
你写得太麻烦,懒得debugger了,给个代码
#include <iostream>
#include <stdlib.h>
using namespace std ;

static char A[10] ;

int main () {
	for (int i = 0 ; i < _countof (A) ; i++)
		cin >> A[i] ;
	qsort (A ,_countof (A) ,sizeof (A[0]) ,[] (const void *a ,const void *b)->int {
		return *(const char *) a - *(const char *) b ;
	}) ;
	int nz ;
	for (nz = 0 ; nz < _countof (A) && A[nz] == '0' ; nz++) ;
	cout << A[nz] ;
	for (int i = 0 ; i < nz ; i++)
		cout << '0' ;
	for (int i = nz + 1 ; i < _countof (A) ; i++)
		cout << A[i] ;
	return 0 ;
}
妖__ING 2015-11-02
  • 打赏
  • 举报
回复
引用 1 楼 ID870177103 的回复:
思路如下 从小到大排序输入,找到第一个不为0的数输出,输出前面的0,输出后面的数字
我就是这么写的,但是结果不完全对,5个测试对了三个,没拿满分,不知道为啥
ID870177103 2015-11-02
  • 打赏
  • 举报
回复
思路如下 从小到大排序输入,找到第一个不为0的数输出,输出前面的0,输出后面的数字

64,682

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧