Codeforces Beta Round #60-B

    技术2022-05-19  27

    给你四位数,最多改变其中每个数的一个数字,是否能按非递减排序。

     

    改变后的数字是大于等于1000小于等于2011的。

     

    昨晚没过。。。 = =。。今早又想了会儿,改改,刚才提交过了 = =。。。

     

    我是打表了,把每个数字能改变的的都放到表里,然后按从小到大排列,然后找最小的满足题意的。

     

    比如 1000 找改变一个数字最小的,下一个数字找比上个数字大但是依然在改变中最小的。。就这么下去。。。

     

    找不到的话,说明不存在。

     

    #include <queue> #include <stack> #include <math.h> #include <stdio.h> #include <stdlib.h> #include <iostream> #include <limits.h> #include <string.h> #include <algorithm> using namespace std; int num[1020]; int map[10020][40]; int len[10020]; void init() { memset(len,0,sizeof(len)); int i,k; for(i=1000; i<=9999; i++) { int x = i; int p = x/10 * 10; map[i][len[i]++] = x; for(k=0; k<=9; k++) { if( p + k >= 1000 && p + k <= 2011 ) map[i][len[i]++] = p+k; } p = x/100*100 + x; for(k=0; k<=9; k++) { if( p + k*10 >= 1000 && p + k*10 <= 2011 ) map[i][len[i]++] = p+k*10; } p = x/1000*1000 + x0; for(k=0; k<=9; k++) { if( p + k*100 >= 1000 && p + k*100 <= 2011 ) map[i][len[i]++] = p+k*100; } p = x00; for(k=0; k<=9; k++) { if( p + k*1000 >= 1000 && p+k*1000<=2011 ) map[i][len[i]++] = p+k*1000; } } } int main() { int n; int output[2000]; int flag; init(); for(int i=1000; i<=9999; i++) sort(map[i],map[i]+len[i]); while( ~scanf("%d",&n) ) { for(int i=1; i<=n; i++) scanf("%d",&num[i]); output[1] = map[num[1]][0]; for(int i=2; i<=n; i++) { flag = 1; for(int k=0; k<len[num[i]]; k++) if( map[num[i]][k] >= output[i-1] && map[num[i]][k] <= 2011 && map[num[i]][k] >= 1000 ) { flag = 0; output[i] = map[num[i]][k]; break; } if( flag ) break; } if( flag ) { printf("No solution/n"); continue; } for(int i=1; i<=n; i++) printf("%d/n",output[i]); } return 0; }  


    最新回复(0)