zoukankan      html  css  js  c++  java
  • E. Minimum Array(贪心)

    题目链接:https://codeforces.com/problemset/problem/1157/E

    题目大意:

    首先输入一个n,然后输入a数组,有n个数。然后输入b数组,也有n个数。然后你可以对b数组进行排序,使得(a[i]+b[i])%n从1~n的字典序最小。

    具体思路:

    通过分析数据范围,我们可以知道两个数相加凑出来n是最合理的,对于当前的数t1,我们要找的是 n-t1 ,如果没有就找n-t2,如果到n还没有,就从0开始凑。

    (貌似set自带的二分好像比普通的lower_bound(三个参数)更优秀,如果是普通的lower_bound就给T了)

    AC代码:

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 # define ll long long
     4 const int maxn = 2e5+100;
     5 vector<int>sto;
     6 multiset<int>b;
     7 int ans[maxn];
     8 int main()
     9 {
    10     int n;
    11     scanf("%d",&n);
    12     for(int i=0; i<n; i++)
    13     {
    14         int tmp;
    15         scanf("%d",&tmp);
    16         sto.push_back(tmp);
    17     }
    18     for(int i=0; i<n; i++)
    19     {
    20         int tmp;
    21         scanf("%d",&tmp);
    22         b.insert(tmp);
    23     }
    24     for(int i=0; i<n; i++)
    25     {
    26         auto u=b.lower_bound(n-sto[i]);
    27         if(u==b.end())
    28             u=b.begin();
    29         ans[i]=(*u+sto[i])%n;
    30         b.erase(u);
    31     }
    32     for(int i=0; i<n; i++)
    33     {
    34         if(i==0)
    35             printf("%d",ans[i]);
    36         else
    37             printf(" %d",ans[i]);
    38     }
    39     printf("
    ");
    40     return 0;
    41 }
  • 相关阅读:
    C语言作业9
    C语言作业8
    学习体会
    C语言作业7
    C语言作业6
    C语言作业5
    C语言作业4
    C语言作业3
    丛铭俣 160809324 (作业12)
    丛铭俣 160809324 (作业10)
  • 原文地址:https://www.cnblogs.com/letlifestop/p/10924177.html
Copyright © 2011-2022 走看看