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; }