列表

详情


QY11. 数字游戏

描述

牛牛举办了一场数字游戏,有n个玩家参加这个游戏,游戏开始每个玩家选定一个数,然后将这个数写在纸上(十进制数,无前缀零),然后接下来对于每一个数字将其数位按照非递减顺序排列,得到新的数,新数的前缀零将被忽略。得到最大数字的玩家赢得这个游戏。

输入描述

输入包括两行,第一行包括一个整数n(1 ≤ n ≤ 50),即玩家的人数 第二行n个整数x[i](0 ≤ x[i] ≤ 100000),即每个玩家写下的整数。

输出描述

输出一个整数,表示赢得游戏的那个玩家获得的最大数字是多少。

示例1

输入:

3
9638 8210 331

输出:

3689

原站题解

C 解法, 执行用时: 2ms, 内存消耗: 232KB, 提交时间: 2019-02-11

#include <stdio.h>
#include <stdlib.h>
int n, a[55];
void init()
{
	scanf("%d", &n);
	for(int i = 0; i < n; i++)
	{
		scanf("%d", &a[i]);
	}
}
int cmp(const void* a, const void* b)
{
	return *(int*)a - *(int*)b;
}
int my_sort(int num)
{
	int stack[10];
	int p = 0;
	while(num)
	{
		stack[p++] = num % 10;
		num /= 10;
	}
	qsort(stack, p, sizeof(int), cmp);
	int sum = 0, mul = 1;
	for(int i = p - 1; i >= 0; i--)
	{
		sum += stack[i] * mul;
		mul *= 10;
	}
	return sum;
}
void fun()
{
	int max = 0;
	for(int i = 0; i < n; i++)
	{
		int t = my_sort(a[i]);
		if(t > max)
			max = t;
	}
	printf("%d\n", max);
}
int main()
{
	init();
	fun();
	return 0;
}

C 解法, 执行用时: 2ms, 内存消耗: 308KB, 提交时间: 2021-09-10

#include <stdio.h>

int f(int num)
{
    int arr[10]={0};
    while(num!=0)
    {
        arr[num%10]++;
        num/=10;
    }
    int i,sum=0;
    for(i=1;i<10;i++)
    {
        while(arr[i]!=0)
        {
            sum=sum*10+i;
            arr[i]--;
        }
    }
    return sum;
}

//index要调整的结点  n是总共结点数 
void reHeap(int arr[],int index,int n){
	int child = 2*index+1;
	int key = arr[index];//需要调整的结点的元素 
	while(child<n){//叶子结点存在 
		if(child+1<n && arr[child] < arr[child+1]){//右孩子存在且比左孩子大 
			++child;	
		} 
		//child记录孩子中更大的那个结点下标
		if(key<arr[child]){
			arr[index] = arr[child];//把孩子的元素放在父结点处 
			index = child;
			child = 2*index+1;
		}else{
			break;
		}
	} 
	arr[index] = key;
} 
//时间复杂度是O(nlogn)  空间复杂度O(1)  不稳定 
void heapSort(int arr[],int n){
	//把完全二叉树调整成大根堆
	int i;
	for(i=n/2;i>=0;--i)//第一个非叶子结点 n/2   从下往上调整 
		reHeap(arr,i,n); 
	for(i=0;i<n-1;i++){//循环进行n-1次
		//arr[0]和arr[n-1-i]最后一个元素交换 
		int tmp = arr[0];
		arr[0] = arr[n-1-i];
		arr[n-1-i] = tmp;
		//不考虑最后一个元素的基础上,重新调整成大根堆  只需要调整0结点 
		reHeap(arr,0,n-1-i);
	}
}

int main()
{
    int n;
    while(scanf("%d",&n)!=EOF)
    {
        int arr[n];
        int index=0,num;
        while(index<n)
        {
            scanf("%d",&num);
            arr[index++]=f(num);
        }
        heapSort(arr,index);
        printf("%d\n",arr[index-1]);
        break;
    }
    return 0;
}

C 解法, 执行用时: 2ms, 内存消耗: 340KB, 提交时间: 2019-06-18

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void sort(int *a, int len){
    int tmp;
    for(int i = 0; i < len; i ++){
        for(int j = 0; j < len - i - 1; j ++){
            if(a[j] > a[j + 1]){
                tmp = a[j];
                a[j] = a[j + 1];
                a[j + 1] = tmp;
            }
        }
    }
}

int trans(int n){
    int *s = (int *)malloc(sizeof(int));
    int k = 0;
    while(n){
        s[k ++] = n % 10;
        n = n / 10;
    }
    sort(s, k);
    int rev = 0;
    for(int i = 0; i < k; i ++)
        rev = rev * 10 + s[i];
    return rev;
}

void find_min(int *a, int len){
    int new_a[len];
    for(int i = 0; i < len; i ++){
        new_a[i] = trans(a[i]);
    }
    sort(new_a, len);
    printf("%d", new_a[len - 1]);
    
}

int main(int argc, const char * argv[]) {
    // insert code here...
    int n;
    scanf("%d", &n);
    int a[n];
    for(int i = 0; i < n; i ++)
        scanf("%d", &a[i]);
    find_min(a, n);
    return 0;
}

C 解法, 执行用时: 2ms, 内存消耗: 348KB, 提交时间: 2019-06-24

#include <stdio.h>
#include <stdlib.h>
int cmp(const void* a, const void* b)
{
	return *(int*)a - *(int*)b;
}
int fun(int x)
{
	int p = 0, array[10] = {0},j, newOut=0;
	while (x)
	{
		array[p++] = x % 10;
		x /= 10;
	}
	qsort(array, p, sizeof(int), cmp);
	int mul = 1;
	for (j = p - 1; j >= 0; j--)
	{
		newOut += array[j] * mul;
		mul *= 10;
	}
	return newOut;
}
int main()
{
	int i, n,maxNumber = 0, tmp,a[50];
	scanf("%d", &n);
	for (i = 0; i < n; i++)
		scanf("%d", &a[i]);
	for (i = 0; i < n; i++)
	{
		tmp = fun(a[i]);		
		if (tmp > maxNumber)
			maxNumber = tmp;
	}
	printf("%d", maxNumber);
	return 0;
}

C 解法, 执行用时: 2ms, 内存消耗: 356KB, 提交时间: 2021-09-15

#include <stdio.h>

int main(){
    int n = 0,max = 0;
    int x[50] = {0};
    int a[5] = {0}, b[5]={10000,1000,100,10,1};
    
    scanf("%d",&n);
    for(int i=0;i<n;i++){
        scanf("%d",&x[i]);
    }
    for(int i=0;i<n;i++){
        if(x[i] == 100000){
            printf("%d",1);
            return 0;
        }
        for(int j=0;j<5;j++){
            a[j] = x[i] / b[j];
            x[i] = x[i] % b[j];
        }
  //      for(int i=0;i<5;i++){
  //          printf("%d",a[i]);
  //      }
   //     printf("\n");
        for(int k=0;k<5;k++){
            for(int l=k+1;l<5;l++){
                int temp = 0 ;
                if(a[k]>a[l]){
                    temp = a[k];
                    a[k] = a[l];
                    a[l] =temp;
                }
            }
        }
        for(int j=0;j<5;j++){
            x[i] = x[i] + a[j]*b[j];
        }
 //       printf("x[%d]=%d\n",i,x[i]);
    }
    max = x[0];
    for(int i=1;i<n;i++){
        if(x[i]>max){
            max = x[i];
        }
    }
    printf("%d",max);
    return 0;
}

上一题