zoukankan      html  css  js  c++  java
  • A Magic Lamp HDU

    Kiki likes traveling. One day she finds a magic lamp, unfortunately the genie in the lamp is not so kind. Kiki must answer a question, and then the genie will realize one of her dreams.
    The question is: give you an integer, you are allowed to delete exactly m digits. The left digits will form a new integer. You should make it minimum.
    You are not allowed to change the order of the digits. Now can you help Kiki to realize her dream?
    Input
    There are several test cases.
    Each test case will contain an integer you are given (which may at most contains 1000 digits.) and the integer m (if the integer contains n digits, m will not bigger then n). The given integer will not contain leading zero.
    Output
    For each case, output the minimum result you can get in one line.
    If the result contains leading zero, ignore it.
    Sample Input
    178543 4
    1000001 1
    100001 2
    12345 2
    54321 2
    Sample Output
    13
    1
    0
    123
    321

    题意:
    给你一个大数,和一个整数m,m小于大数的长度,让你从这个大数中删除m个数字,使剩下的数最小。
    思路:
    逆向思维,让删除m个数组,那么就是还剩下len-m个数字。那么我们把 问题转化从这个大数中选择len-m个数字,使选择的数最小。

    那么直接贪心了。

    首先要分析出一个性质:

    选择出的第一个数字一定是在 0~m 这m+1个数中的一个, 因为 最多删除m个,所以这m+1个数中一定有至少一个是被选择的。记录这个区间的最小值x以及位置id,那么下一个数一定是在 id+1~id+1+m 这个区间里。

    细节见代码:

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    #include <cmath>
    #include <queue>
    #include <stack>
    #include <map>
    #include <set>
    #include <vector>
    #include <iomanip>
    #define ALL(x) (x).begin(), (x).end()
    #define rt return
    #define dll(x) scanf("%I64d",&x)
    #define xll(x) printf("%I64d
    ",x)
    #define sz(a) int(a.size())
    #define all(a) a.begin(), a.end()
    #define rep(i,x,n) for(int i=x;i<n;i++)
    #define repd(i,x,n) for(int i=x;i<=n;i++)
    #define pii pair<int,int>
    #define pll pair<long long ,long long>
    #define gbtb ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)
    #define MS0(X) memset((X), 0, sizeof((X)))
    #define MSC0(X) memset((X), '', sizeof((X)))
    #define pb push_back
    #define mp make_pair
    #define fi first
    #define se second
    #define eps 1e-6
    #define gg(x) getInt(&x)
    #define chu(x) cout<<"["<<#x<<" "<<(x)<<"]"<<endl
    using namespace std;
    typedef long long ll;
    ll gcd(ll a, ll b) {return b ? gcd(b, a % b) : a;}
    ll lcm(ll a, ll b) {return a / gcd(a, b) * b;}
    ll powmod(ll a, ll b, ll MOD) {ll ans = 1; while (b) {if (b % 2)ans = ans * a % MOD; a = a * a % MOD; b /= 2;} return ans;}
    inline void getInt(int* p);
    const int maxn = 1000010;
    const int inf = 0x3f3f3f3f;
    /*** TEMPLATE CODE * * STARTS HERE ***/
    
    int main()
    {
    	//freopen("D:\code\text\input.txt","r",stdin);
    	//freopen("D:\code\text\output.txt","w",stdout);
    	string str;
    	int m;
    	while(cin>>str>>m)
    	{
    		int len=str.length();
    		string ans="";
    		int l=0;
    		int flag=0;
    		for(int i=m;i<len;++i)
    		{
    			int k=10;
    			for(int j=l;j<=i;++j)
    			{
    				if(str[j]-'0'<k)
    				{
    					l=j+1;
    					k=str[j]-'0';
    				}
    			}
    			if(k)
    			{
    				flag=1;
    			}
    			if(flag)
    			{
    				ans.push_back((char)(k+'0'));
    			}
    
    		}
    		if(sz(ans)==0)
    		{
    			cout<<0<<endl;
    		}else
    		{
    			cout<<ans<<endl;
    		}
    	}
    	return 0;
    }
     
    inline void getInt(int* p) {
    	char ch;
    	do {
    		ch = getchar();
    	} while (ch == ' ' || ch == '
    ');
    	if (ch == '-') {
    		*p = -(getchar() - '0');
    		while ((ch = getchar()) >= '0' && ch <= '9') {
    			*p = *p * 10 - ch + '0';
    		}
    	}
    	else {
    		*p = ch - '0';
    		while ((ch = getchar()) >= '0' && ch <= '9') {
    			*p = *p * 10 + ch - '0';
    		}
    	}
    }
     
     
    
    
    
    本博客为本人原创,如需转载,请必须声明博客的源地址。 本人博客地址为:www.cnblogs.com/qieqiemin/ 希望所写的文章对您有帮助。
  • 相关阅读:
    多库查询 sp_addlinkedserver使用方法(添加链接服务器)(转)片段整理
    利用asp.net路由实现url解析
    C#事务 访问数据库(转)
    男人30而立,30岁的男人喊起来!你们立了吗?
    c# 调用SQL Server存储过程返回值(转)
    转摘 JQUERY操作JSON例子
    jstree 从简单说起Jquery 插件应用说明
    利用反射对对象属性赋值取值操作
    asp.net 造成seesion 丢失的问题之一
    jquery 实现从左边listbox选择至右边listbox
  • 原文地址:https://www.cnblogs.com/qieqiemin/p/11215776.html
Copyright © 2011-2022 走看看