首页 > 其他分享 >C 排序

C 排序

时间:2023-09-23 17:11:23浏览次数:27  
标签:10 超时 int -- solve 排序 贪心

贪心

做好优化,否者超时
对于第一位a,它只可能替换成a-1,所以如果在a到a-1的数字内只有a或者a-2,那么a-1就可以取代a。
因此我们可以开10个数组来存储每个数字的下标,对于每一位从0开始贪心的枚举每一位,如果有满足的j,那么直接替换,肯定有一个j满足要求(因为它自己肯定满足)。

代码里有一定的注释

点击查看代码
#include<bits/stdc++.h>
using namespace std;
vector<int> v[10];//一定要放在外面,不然会超时
void solve(){
    string s;
    cin>>s;
    int n=s.length();
    for(int i=n-1;i>=0;i--){
        v[s[i]-'0'].emplace_back(i);//记录每个数字出现的位置,倒序是为了快速找到第一次出现的位置
    }
    for(int i=0;i<n;i++){//枚举每一位
        for(int j=0;j<=9;j++){//从最小开始枚举
            if(v[j].empty()) continue;
            int flag=1;
            for(int k=0;k<=9;k++){
                if(abs(j-k)>1&&abs(j-k)<9&&!v[k].empty()&&v[k].back()<v[j].back()){
				//不满足退出,枚举下一个j
				//如果相差大于1或者不是9,肯定不满足,当然要确保它是否在其前面,或者它是否存在
                    flag=0;
                    break;
                }
            }
            if(flag){
                v[j].pop_back();
                cout<<(char)(j+'0');
                break;
            }
        }
    }
    cout<<'\n';
}
int main(){
    ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);//取消同步不然会超时
    int t;
    cin>>t;
    while(t--){
        solve();
    }
    return 0;
}

标签:10,超时,int,--,solve,排序,贪心
From: https://www.cnblogs.com/bu-fan/p/17724732.html

相关文章

  • 算法基础之快速排序
    quick_sort方法中如果i=l,j=r会死循环的分析示例代码voidquick_sort(inta[],intl,intr){if(l>=r)return;inti=l,j=r;//此处设置会导致死循环intx=num[(l+r)>>1];while(i<j){while(a[++i]<x);//死循环的地方while(a[--j]>x......
  • 【Java 基础篇】Java 自然排序:使用 Comparable 接口详解
    在Java编程中,我们经常需要对对象进行排序。为了实现排序,Java提供了java.lang.Comparable接口,它允许我们定义对象之间的自然顺序。本篇博客将深入探讨如何使用Comparable接口来进行自然排序,包括接口的基本概念、使用示例以及一些常见问题的解决方法。什么是自然排序?自然排序......
  • 【Java 基础篇】Java 比较器排序:精通自定义对象排序
    在Java编程中,排序是一个非常常见且重要的操作。Java提供了多种排序机制,其中之一就是使用比较器(Comparator)进行排序。比较器允许您自定义对象的排序方式,使您能够实现各种排序需求,从简单的对象排序到复杂的多属性排序。本篇博客将从入门到高级,详细介绍Java比较器排序的使用。什......
  • Excel_复杂文本字母数字混合排序
     引ADC_DCAL_DN1[13:0]ADC_DCAL_DN10[13:0]ADC_DCAL_DN11[13:0]ADC_DCAL_DN2[13:0]ADC_DCAL_DN3[13:0]ADC1_EOCADC10_EOCADC11_EOCADC2_EOCADC3_EOCADC4_EOCADC5_EOCADC_CALCB1_CALI_ADC[7:0]CB1......
  • [CSP-J 2021] 插入排序
    题目描述插入排序是一种非常常见且简单的排序算法。小Z是一名大一的新生,今天H老师刚刚在上课的时候讲了插入排序算法。假设比较两个元素的时间为\(\mathcalO(1)\),则插入排序可以以\(\mathcalO(n^2)\)的时间复杂度完成长度为\(n\)的数组的排序。不妨假设这\(n\)个数......
  • [算法学习笔记] 浅谈二路归并&双指针&归并排序
    二路归并·双指针是一种优化思想。它可以在\(O(n)\)的复杂度下把两个长度为\(n\)的有序数组合并为一个有序数组。它的具体处理方法如下:定义两个长度为\(n\)的升序数组\(a,b\)。,合并完后长度为\(2n\)的数组\(c\),初始化两个指针\(x=y=1\)(这里数组下标从\(1\)开始)......
  • java中:idea开发环境下如何对5位数进行排序
    问题如何随机输入5位数,并对其进行排序,有序输出步骤打开idea,找到上方菜单栏中的file,按顺序file-new-project,新建工程文件。在建立好的工程文件的src文件下,新建类,最后输入代码图例如下代码如下publicclassDifferentFive{//随机输入5个不同的数字,使用程序将其有序输出pub......
  • 拓补排序
    拓补排序是对有向图的一种处理方式,目的是得到拓补序列,一个有向图,他肯定有很多节点和有向边,拓补序列的性质就是图中所有的边所对应的两个点在该序列中都是起点在前终点在后如下图,其中的一种拓补序列就是12435,图中的所有有向边是{1,2},{1,4},{2,3},{2,5},{4,5}。1在2的前面,1在4的前面.........
  • python,一个数组y1存放yolo的位置信息BBOX,一个y2数组存放识别的结果信息,根据y1数组按
    importnumpyasnp#示例数据y1=np.array([[50,100,200,300],[10,20,30,40],[60,70,80,90]])y2=np.array(['cat','dog','bird'])#按左上角点的坐标排序y1数组sorted_indices=np.lexsort((y1[:,1],y1[:,0]))y1_sorted=y1[sorted......
  • MySQL中row_number()的实现,查询记录排序行数
    MySQL中row_number()的实现,查询记录排序行数时间  2019-12-06标签 mysql row number 实现 查询 记录 排序 行数 栏目 MySQL 繁體版原文   https://my.oschina.net/u/3087202/blog/1842169  在MySQL8.0之前是有没row_number()这个窗口函数的,若是想实......