zoukankan      html  css  js  c++  java
  • 区间取最小值最大值-位值和

    更新一次,else少写了一点处理,改掉。

    题目如下

    解题的一点思路

    最小值简单,最大值就要进行一系列的██████。

    我觉得我写的没人能看明白了,自己琢磨吧......唉。

    #include <stdio.h>
    #include <windows.h> 
    #include <math.h>
    
    int main(void){
        UINT x=0,l=2000,r=8000;//区间2000~8000 
        UINT lw=0,rw=0;//区间值的位数 
        UINT nn[10]={0};//,nn2[10]={0},nn3[10]={0};
        
        scanf("%u%u%u",&x,&l,&r);//输入数字 
        printf("
    ");
        UINT w=0,sum=0;
        w=l;// 
        while(w){
            sum++;
            w/=10;
        }
        lw=sum;//下限长度 
        sum=0; 
        w=0;
        w=r;// 
        while(w){
            sum++;
            w/=10;
        }
        rw=sum;//上限长度 
        //printf("%u %u
    ",lw,rw); 
        for(UINT i=0,temp=0,temp2=0;i<10;i++){//得到每位,到数组1234=4,3,2,1 
            temp2=x%(UINT)ceil(pow(10,i+1));
            nn[i]=(temp2-temp)/(UINT)ceil(pow(10,i));
            //nn2[i]=nn[i];
            //nn3[i]=nn[i];
            temp=temp2;
        }
        
        UINT ln[10]={0},rn[10]={0};
        for(UINT i=0,temp=0,temp2=0;i<lw;i++){//得到每位,区间最小值2000 
            temp2=l%(UINT)ceil(pow(10,i+1));
            ln[i]=(temp2-temp)/(UINT)ceil(pow(10,i));
            temp=temp2;
        }
        UINT n=0;
        UINT l2=l;
        for(int i=0;i<lw;i++){//先将每位数的和得到,最小值 
            n+=ln[i];
        }
        //printf("%u",n);
        for(UINT i=0,i2=0,temp=0;i<666;i++){//i2-位指针变量 
    
            if(ln[i2]==9){//判断位指针进位 
                i2++;
            }
            if(n!=x){
                n++;//加到28 
                l2+=ceil(pow(10,i2));
                ln[i2]++;
                
            }
            else{
                break;
            }
            
        }
        printf("最小值=%u
    ",l2);
        n=0;//初始化 n为初始计数,8000=8 
        UINT r2;
        for(UINT i=0,temp=0,temp2=0;i<rw;i++){//得到每位,区间最大值8000 
            temp2=r%(UINT)ceil(pow(10,i+1));
            rn[i]=(temp2-temp)/(UINT)ceil(pow(10,i));
            temp=temp2;
        }
        for(int i=0;i<rw;i++){//先将每位数的和得到,最大值 
            n+=rn[i];
        }
        
        for(UINT i=0,i2=0,temp=0;i<666;i++){//i2-位指针变量 
    
            if(i2==(rw-1)){//0000=0,1,2,3 超限 
                printf("_<< 超限!
    %d",0);
                break;
            }
            if(rn[i2+1]!=0){
                n-=rn[i2];//n-位值 
                rn[i2+1]--;
    
    //            for(int k=0;k<4;k++){
    //                printf("k=%u
    ",rn[k]);
    //            }
                if((n-1)+(i2+1)*9>=x){        
                    r2=((n-1)+(i2+1)*9)-x;//r2 记录差值 
                    n=r-(UINT)ceil(pow(10,i2+1));
                    for(int ii=0;ii< (i2+1);ii++){
                        n-=rn[ii]*(UINT)ceil(pow(10,ii));
                        n+=9*(UINT)ceil(pow(10,ii));
                        rn[ii]=9;
                    }
                    
                    break;
                }
                else{
                    rn[i2+1]++;
                    i2++;//如果<28,位增加 
                }
            }
            else{
                n-=rn[i2];//n-位值 
                i2++;//如果=0,位增加 
            }
        
        }
    
        for(UINT i=0,i2=0,temp=0;i<r2;i++){//i2-位指针变量 
            if(rn[i2]==0){//判断位指针进位 
                i2++;
            }        
            n-=ceil(pow(10,i2));
            rn[i2]--;
            
        }
        printf("最大值=%u
    ",n);
        
        
        
    }
  • 相关阅读:
    [noip2013]华容道
    [tyvj 1061] Mobile Service (线性dp 滚动数组)
    [bzoj 2726] 任务安排 (斜率优化 线性dp)
    [洛谷 P2365] 任务安排 (线性dp)
    [poj 3666] Making the Grade (离散化 线性dp)
    【模板】manacher算法
    [tyvj 1071] LCIS
    [NOIP 2012] 国王游戏
    [NOIP 2010] 关押罪犯 (二分+二分图判定 || 并查集)
    [NOI 2002] 银河英雄传说 (带权并查集)
  • 原文地址:https://www.cnblogs.com/pta00/p/12960844.html
Copyright © 2011-2022 走看看