栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

18870 最佳搭配

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

18870 最佳搭配

本题目改编自CF 555

Problem - E - Codeforceshttp://codeforces.com/contest/1157/problem/E对于set用法可参考(更重要的是要多使用多练习)

c++ stl容器set成员函数介绍及set集合插入,遍历等用法举例_c/c++_编程语言_

解题思路:经过阅读题目,发现是在数组B中选择合适的值与a[i]相加后对n求余,并使得结果尽可能小。那么最佳情况显然应该在B中选择值恰好为n-a[i],如果不存在n-a[i]这样的值,那么应该是大于n-a[i]的最小值,如果不存在大于等于n-a[i]的值,那么应该选择B中最小值。

由于B中存在重复值,因此必须使用multiset作为存储结构,multiset和set区别是set无重复元素,multiset可以存重复元素。算法思想直接参考代码:

#include 
#include 
typedef long long ll;
using namespace std;
int a[1000005];
int main()
{
    ios::sync_with_stdio(0),cin.tie(0);
    int i,j,n,m,x;
    multiset s;
    cin>>n;
    for(i=1; i<=n; i++)
        cin>>a[i];
    for(i=1; i<=n; i++) 
        cin>>x,s.insert(x);
    for(i=1; i<=n; i++)
    {
        
        multiset::iterator it=s.lower_bound(n-a[i]);
        if(it==s.end())
            it=s.begin();
        cout<<(a[i]+*it)%n<<' ';
        s.erase(it); //拿走的元素将其删除,注意参数要用指针,如果用*it做参数,那么会把所有相同值元素都删除
    }
    return 0;
}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/847262.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号