首页 > 其他分享 >P1106 删数问题

P1106 删数问题

时间:2023-10-22 22:44:07浏览次数:32  
标签:std P1106 int sum 问题 ++ 删数 minP using

P1106删数问题

对2018年的我一次完美的对位单杀

2018 44pts Code

#include<cstdio>
#include<iostream>
#include<algorithm>
using std::cin;
using std::cout;
using std::sort;
using std::pair;
using std::string;

string zsk_lu_ping;
struct zsksb
{
    int place;
    int w;
    bool operator < (const zsksb & rhs)
    const{
        return w>rhs.w;
    }
}zsk_chao_ti_jie[43534];
int d;
int vis[3434];
int main(void)
{
    cin>>zsk_lu_ping;
    cin>>d;
    for(int i=0;i<zsk_lu_ping.length();i++)
    {
        zsk_chao_ti_jie[i].place=i;
        zsk_chao_ti_jie[i].w=zsk_lu_ping[i]-'0';
    }
    sort(zsk_chao_ti_jie,zsk_chao_ti_jie+zsk_lu_ping.length());
    for(int i=0;i<d;i++)
    {
        vis[zsk_chao_ti_jie[i].place]=1;
    }
    for(int i=0;i<zsk_lu_ping.length();i++)
    {
        if(!vis[i])
        {
            cout<<zsk_lu_ping[i];
        }
    }
}

先来看看为什么错,2018年的做法是无脑找前K大的数,然后删去,这是存在问题的。

比如13928 2。如果按照这个算法,我会删去9、8,剩余的数是\(132\)。而显然删去3、9,剩余的数是128是一个更好的解法。

2023 72pts Code

#include <iostream>
using namespace std;

string s;
int k, minn, minP, sum;
char ans[300];

int main() {
	cin >> s >> k;
	for (int i = 0; i < s.length(); i++) {
		minn = 100;
		for (int j = i; j <= i + k; j++) {
			if (minn > s[j] - '0') {
				minn = s[j] - '0';
				minP = j;
			}
		}
		k -= minP - i;
		i = minP;
		ans[sum++] = s[minP];
	}
	for (int i = 0; i < sum; i++) {
		cout << ans[i];
	}
	return 0;
}

时隔五年,我重做这道题目,放下浮躁慢慢想。

我事先知道这是贪心,把题目转化为这样一个问题

从当前最高位开始,在右端k位中寻找最小值,将最小值转到最高位,并将最高位移至最小值所在位的下一位。k减去最小值移动的位数。

这是一个正确的贪心。但我没有处理ans中的前导零,处理完细节后拿下AC.

#include <iostream>
using namespace std;

string s;
int k, minn, minP, sum, isFirst;
char ans[300];

int main() {
	cin >> s >> k;
	for (int i = 0; i < s.length(); i++) {
		minn = 100;
		for (int j = i; j <= i + k; j++) {
			if (minn > s[j] - '0') {
				minn = s[j] - '0';
				minP = j;
			}
		}
		k -= minP - i;
		i = minP;
		ans[sum++] = s[minP];
	}
	for (int i = 0; i < sum; i++) {
		if (ans[i] == '0' && !isFirst) {
			continue;
		}
		isFirst = true;
		cout << ans[i];
	}
	if (!isFirst) {
		cout << 0;
	}
	return 0;
}

标签:std,P1106,int,sum,问题,++,删数,minP,using
From: https://www.cnblogs.com/kdlyh/p/17781322.html

相关文章

  • IPV6问题处理-双栈环境IPv6网络不通模拟测试
    1.1网络拓扑环境描述测试是在公司现有的环境下进行测试的,IPv4网络全通无故障,没有IPv6网络外网线路。主机是自己的电脑,支持双栈。1.3验证问题验证在双栈网络中,主机会优先请求DNS的AAAA记录,如果ipv6网络故障了,还是否会根据向DNS请求来的AAAA记录去访问网站,从而导致断网。设备配置2.1H......
  • 树上问题相关
    基本定义与前置知识树的dfs序:我们称对一棵树\(T\)进行深度优先搜索后得到的节点序列为树的dfs序。称\(dfn(u)\)表示\(u\)号点在dfs序中的位置。我们称\(anc(u)\)为\(u\)在树中的父节点,\(dep(u)\)表示\(u\)的深度(一般的,这里的深度定义为经过的点数)。我......
  • 递归求解N皇后问题
      ......
  • 非递归求解N皇后问题
      ......
  • 解决Clion中写多个C++文件中存在多个main函数报错的问题
    解决Clion中写多个C++文件中存在多个main函数报错的问题在刷题写C++的时候,常常因为要写多个文件,这时存在多个main就会报错,通常解决这个问题会有以下两种解决方法:把不需要的main给注释掉新建一个Project项目这边我介绍一种新的办法:(适用于IDEA)1.先下载这个插件,C/C++Single......
  • 深度优先搜索的最短路径问题
    这个简单的图,要求使用深度优先算法求出(1,1)到终点的最短路径。1、分析就目前看来,(1,1)->(1,2)->(2,2)->(2,3)->(2,4)->(3,4)->(4,4)->(4,3)和(1,1)->(2,1)->(3,1)->(4,1)->(5,1)->(5,2)->(5,3)->(4,3)这两条路径是相同的长度的最短路劲。但是,这是我们的肉眼看到的,如果是计算机计......
  • 解决Linux非root用户读写串口权限问题
    查看串口和基本设置查看串口:ls/dev/ttyUSB*查看参数:stty-F/dev/ttyUSB0设置波特率:stty-F/dev/ttyUSB0speed9600收发数据先打开后台接收:cat/dev/ttyUSB0&发送:echohello>/dev/ttyUSB0可以使用printf做更精确的控制:printf'hello\r'>/dev/ttyUSB0解决"P......
  • 数据结构面试常问问题--保研及考研复试
    前言:Hello大家好,我是Dream。今年保研上岸山东大学人工智能专业(经验贴),现在将我自己的专业课备考知识点整理出来,分享给大家,希望可以帮助到大家!这是重点知识总结,如果你想看全部的内容的话,这里我给大家都已经打包好了,需要自取:保研复试全套材料+408专业课知识总结及思维导图(点击即可......
  • idea或者goland输出拷贝问题
    比如你拷贝一串很长的base字符串或者是json串,你会把\n也拷贝出来,这时候就很头疼,有2种解决方案,1是直接写文件,然后文件里copy出来2是借助vim,windows上面是gvim,查找\n,就能把隐藏的\n查出来,也算是一个小tips。......
  • 如何解决“未在本地计算机上注册“Microsoft.ACE.OLEDB.12.0”提供程序”问题
    最近在做Excel文件导入时候,出现"未在本地计算机上注册“Microsoft.ACE.OLEDB.12.0”提供程序" 问题 产生原因:这个问题一般是在导入Excel文件的时候报的错,原因是缺少了相对应的MicrosoftAccessDatabaseEngine组件。解决方法:安装AccessDatabaseEngine插件1)访问下载路径(http......