zoukankan      html  css  js  c++  java
  • #模拟#U137456 数字

    题目

    牛牛和他的小伙伴们高高兴兴的吃完了蛋糕,吃完蛋糕之后就到了牛牛和他的小伙伴们最喜欢的环节了——猜数 字,

    这次是牛牛的生日,大家决定让牛牛来制定规则,由于牛牛的生日是4月7日,所以牛牛特别喜欢数字4和数字 7,

    于是牛牛希望大家说出的数字都只包含这两个数字,但这对经常玩这个游戏的他们来说太简单了,所以牛牛加了 一个条件,

    两个数字的数量需要相等,规则制定完了就可以开始游戏了,每次牛牛会喊出一个数字(n)

    小伙伴们需要 抢先答出最小的不小于(n)的满足牛牛的条件的数字,谁先答出来谁就赢了。


    分析

    如果(n)的位数为奇数,输出(4dots 47dots 7)
    如果答案不是(n)的位数同样的道理
    然后只要遇到小于4的数字直接结束,
    遇到4,如果4没填完填4,
    否则当遇到(leq 7)的数字且7没填完的话直接结束
    否则把能够扔掉的4换成7直接结束,
    赛时找到一堆反例hack自己代码,然后拼命填坑,但还有一个坑没填完qwq


    代码

    #include <cstdio>
    #include <cstring>
    #define rr register
    using namespace std;
    int len,mid; char a[100011],s[100011];
    inline bool exceed(int len,int mid){
    	for (rr int i=1;i<=mid;++i)
    	    if (s[i]^55) return s[i]>55;
    	for (rr int i=1;i<=mid;++i)
    	    if (s[i+mid]^52) return s[i+mid]>52;
    	return 0;
    }
    signed main(){
    	while (scanf("%s",s+1)==1){
    		len=strlen(s+1),mid=len>>1;
    		if (len&1||exceed(len,mid)){
    			++mid;
    			for (rr int i=1;i<=mid;++i) putchar(52);
    			for (rr int i=1;i<=mid;++i) putchar(55);
    			putchar(10); continue;
    		}
    		rr int four=0,seven=0;
    		for (rr int i=1;i<=len;++i)
    		if (s[i]<52){
    			for (rr int j=0;j<mid-four;++j) a[j+i]=52;
    			for (rr int j=0;j<mid-seven;++j) a[len-j]=55;
    			four=mid,seven=mid; break;
    		}else if (four<mid&&s[i]==52) a[i]=52,++four;
    		else if (seven<mid&&s[i]<55){
    			a[i]=55,++seven;
    			for (rr int j=0;j<mid-four;++j) a[j+i+1]=52;
    			for (rr int j=0;j<mid-seven;++j) a[len-j]=55;
    			four=mid,seven=mid; break;
    		}else if (seven<mid&&s[i]==55) a[i]=55,++seven;
    		else{
    			rr int st=i-1,f=0;
    			for (;st;--st){
    				if (a[st]==55) f=1;
    			    if (a[st]==52&&(f||seven<mid)) break;
    		    }
    		    if (!st){
    		    	a[1]=55,seven=1,four=0;
    		    	for (rr int j=1;j<=mid-four;++j) a[j+1]=52;
    		    	for (rr int j=0;j<mid-seven;++j) a[len-j]=55;
    		    	break;
    			}
    			a[st]=55,four=0,seven=1;
    			for (rr int i=1;i<st;++i)
    			if (a[i]^52) ++seven;
    			    else ++four;
    			for (rr int j=0;j<mid-four;++j) a[j+st+1]=52;
    			for (rr int j=0;j<mid-seven;++j) a[len-j]=55;	
    			four=mid,seven=mid; break;
    		}
    		for (rr int i=1;i<=len;++i) putchar(a[i]); putchar(10);
    	}
    	return 0;
    } 
    
  • 相关阅读:
    C++内嵌汇编代码,简单文件加密
    汇编查看StackFrame栈帧
    cdecl和stdcall调用约定-汇编演示
    汇编获取键盘输入,及改变文本颜色
    XLAT转码:以DS:【BX+AL】为地址,提取存储器中的一个字节再送入AL
    应中DOS中断显示字符串(摘自《汇编语言》王爽)
    汇编显示彩色字
    汇编ASCII大小写转换(字符串长度$的用法)
    SQLite.net发布后找不到"SQLite.Interop.dll"的问题
    linux使用shutdown.sh命令关闭不完tomcat进程的处理方法
  • 原文地址:https://www.cnblogs.com/Spare-No-Effort/p/13884935.html
Copyright © 2011-2022 走看看