• N^2取N


    序列合并

    有两个长度都是N的序列A和B,在A和B中各取一个数相加可以得到N^2个和,求这N^2个和中最小的N个。

    先把A B排序 然后pushA[1]+B[i](1<=i<=n)每次取出一个最小的之后把b[i]和i对应的下个a相加push

    #include <iostream>
    #include <cstdio>
    #include <vector>
    #include <queue>
    using namespace std;
    typedef pair<int,int> pii;
    const int maxn = 1e5+7;
    int a[maxn],b[maxn],mark[maxn];
    int main(){
        priority_queue<pii,vector<pii>,greater<pii> >Q;
        int N;
        cin>>N;
        for(int i = 1;i <= N;++i)
            scanf("%d",&a[i]);
        for(int i = 1;i <= N;++i)
            scanf("%d",&b[i]);
        for(int i = 1;i <= N;++i){
            mark[i] = 1;
            Q.push(make_pair(a[1]+b[i],i));
        }
        while(N--){
            pii p = Q.top();
            Q.pop();
            printf("%d ",p.first);
            p.first = b[p.second] + a[++mark[p.second]];
            Q.push(p);
        }
    }
    View Code

    N^2相乘的话 加个log

    取最大的话就加负号

    最小函数值

    有n个函数,分别为F1,F2,...,Fn。定义Fi(x)=Ai*x^2+Bi*x+Ci (x∈N*)。给定这些Ai、Bi和Ci,请求出所有函数的所有函数值中最小的m个(如有重复的要输出多个)。

    #include <cstdio>
    #include <queue>
    #include <cmath>
    #include <vector>
    #include <cstring>
    #include <iostream>
    #include <algorithm>
    
    using namespace std;
    
    const int maxn = 100010;
    
    priority_queue < pair<int, int>, vector<pair<int, int> >, greater<pair<int, int> > > q; //让优先队列从小到大弹出
    int n, m,x[maxn];
    
    struct node
    {
        int a, b, c;
    }f[maxn];
    
    int jisuan(int i, int x)
    {
        return x * x * f[i].a + x * f[i].b + f[i].c;
    }
    
    int main()
    {
        scanf("%d%d", &n, &m);
        for (int i = 1; i <= n; i++)
            scanf("%d%d%d", &f[i].a, &f[i].b, &f[i].c);
        for (int i = 1; i <= n; i++)
            x[i] = 1;
        for (int i = 1; i <= n; i++)
        {
            int temp = jisuan(i, 1);
            q.push(pair<int,int>(temp,i));
        }
        for (int i = 1; i <= m; i++)
        {
            pair<int,int> temp = q.top();
            q.pop();
            int nextx = temp.second;
            printf("%d ", temp.first);
            x[nextx]++;
            q.push(pair<int, int>(jisuan(nextx, x[nextx]), nextx));
        }
    
        return 0;
    }
    View Code
  • 相关阅读:
    [NOI2004] 郁闷的出纳员
    [洛谷P4556] 雨天的尾巴
    【转】进程、线程、 GIL全局解释器锁知识点整理
    Python3中的SocketServer
    socket 上传文件代码
    python socket 连续send,出现粘包问题
    【转】动态导入模块的两种方法
    【转】面向对象高级语法部分
    python的垃圾回收机制和析构函数__del__
    django 项目使用setting文件里定义的变量方法
  • 原文地址:https://www.cnblogs.com/Aragaki/p/8661032.html
Copyright © 2020-2023  润新知