首页 > 其他分享 >问题 E: 兔兔的最小数组

问题 E: 兔兔的最小数组

时间:2023-11-07 15:57:31浏览次数:50  
标签:取模 ma int 兔兔 最小 查找 数组

如果你觉得并查集难以理解的话请看此篇

题意:求字典序最小
思路:
比较字典序最小,类似于字符串的比较:只要前面保证最小即可,如:1000大于0111

首先最简单,考虑暴力枚举每个b数组,使得取模后最小,时间复杂度为n^2,(注意:使用后的b数组应该删除)
暴力肯定会wa,所以考虑优化

因为是查找b数组中的值,且可以任意排序,考虑二分优化
查找b数组大于等于(n-a[i])的第一个值
1.如果b数组存在(n-a[i]),优先使用,因为该值取模后为零,字典序肯定最小
2.如果1不满足,则查找第一个大于(n-a[i])的值,因为b数组的值最大为n-1,所以取模后一定小于a[i]
特判
3.如果不存在大于等于(n-a[i])的值,那么使用最小值,这样该位置的值最小

注意:用过的值要删掉(或者过滤,实现方法很多)

如:
1.如果该位置为4,n=7,b数组为 1,4。则b数组选4,最小
2.如果该位置为4,n=7,b数组为 1,2.则b数组选1,最小

ok,到此,思路结束,下面是我的做法

1.利用map存储b数组,map会自己排序
2.利用lower_bound(查找第一个大于等于x的地址)
3.删除用erase

点击查看代码
#include<bits/stdc++.h>
using namespace std;
const int N=2e5+10;
int a[N],b[N];
map<int,int> ma;
int main(){
    // ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
    int n;
    cin>>n;
    for(int i=1;i<=n;i++) cin>>a[i];
    for(int i=1;i<=n;i++) {
        cin>>b[i];
        ma[b[i]]++;
    }
    for(int i=1;i<=n;i++){
        auto it=ma.lower_bound(n-a[i]);
        if(it!=ma.end()){//如果能找到,使用该值
            cout<<(a[i]+(*it).first)%n<<' ';
            if(--(it->second)==0) ma.erase(it);
        }
        else{//如果找不到,则使用最小值
            auto id=ma.begin();
            cout<<(a[i]+id->first)%n<<' ';
            if(--(id->second)==0) ma.erase(id);
        }
    }
    return 0;
}

标签:取模,ma,int,兔兔,最小,查找,数组
From: https://www.cnblogs.com/bu-fan/p/17815156.html

相关文章

  • byte[]、list<byte>数组类型的几个自定义扩展方法
    byte[]、list<byte>数组类型的几个自定义扩展方法。usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Web;namespaceiPublic.类型扩展方法{///<summary>///类型的扩展方法,用起来方便的///修改记录:///20230415,海......
  • 常见数组的排序算法的特点
    假设这些排序算法想得到一个升序序列,长度为n。参考https://blog.csdn.net/qq_53414724/article/details/125016223https://zhuanlan.zhihu.com/p/602971700冒泡排序冒泡排序从头开始寻找相邻的元素,找到较大的元素放于后面,一直到数组末尾。循环n-1轮,每一轮都从0开始,但结束位置......
  • vue:通过数组循环创建表格,表格中有输入框需校验,最后需要一次性校验所有表格。
    表格内有form表单,form表单绑定的model数据类型必须为对象。所以需要先处理一下接口请求回来的数据。 表单需要校验,校验要用到ref,所以通过索引给每个表单生成自己专属的ref。 统一写一个校验规则,绑定至form表单中的rules中,随后在表格内的输入框form-item中绑定对应的规定。......
  • C语言 读取二进制文件中的数组
    获取最后n行数据把每个数组看成是1行#include<stdio.h>intmain(void){//示例数据成员大小最多20字节成员数量最多5个chars1[5][20]={"a1","a2","a3","a4","a5"};chars2[5][20]={"b1","b2",&qu......
  • 最小二乘法 least square method
    最小二乘法(又称最小平方法)是一种数学优化技术。它通过最小化误差的平方和寻找数据的最佳函数匹配。利用最小二乘法可以简便地求得未知的数据,并使得这些求得的数据与实际数据之间误差的平方和为最小。最小二乘法还可用于曲线拟合。其他一些优化问题也可通过最小化能量或最大化熵用最......
  • COM服务项目中数据块(数组)的高效传输方式
    1.问题背景在《C#程序与COM服务程序传递数组和字符串的方式》一文中,我提供了数组的传递方式,是通过atlsafe.h中CComSafeArray模板类来实现的,但是在实际开发过程中发现,直接使用其自身提供的随机数据访问函数进行数据操作速度较慢,在大量传输数据时运行时间不可接受,所以本文记录......
  • js 数组按指定字段转map-list结构
    js数组按指定字段转map-list结构背景介绍在开发过程中经常会出现接口返回整个数组,我们需要将数组进行二次处理,如下格式按照不同功能模块(type)进行数据拆分原始数据constlist=[{"type":"red","id":1,"name":"a","count":1}, {"type":"red","......
  • sizeof结构体数组指针和sizeof数组指针的区别
    请思考一下以下代码输出的sizeof分别是多少?#include<stdio.h>typedefstruct{charname[100];unsignedcharage;}student_t,*student_ptr;intmain(intargc,char*argv[]){student_tstu={0};student_ptrpStu=&stu;charname[100]={0};......
  • 前缀和+差分数组
    一、一维数组度前缀和--固定数组查询区间和1.1定义对于给定一个数组arr(下标从0开始),它的前缀和S[i]表示从arr[0]到arr[i]元素总和。1.2构造前缀和S[i]=S[i-1]+arr[i-1]1.3应用-求某个区间的和计算区间[i,j]的元素和=>arr[i]+arr[i+1]+arr[i+2]+……+a......
  • C++二维数组输出3
    题目描述输入一个整数\(N\),输出一个N行N列的二维矩阵,矩阵中的元素按列用\(1\)~\(N\)\(∗\)\(N\)蛇形填充。输入格式一个整数\red{N}\(N\)(\(N<=10\))输出格式输出N行N列的矩阵,元素之间用一个空格隔开,行末不要有多余的空格。样例输入数据3输出数据123654789......