ICPC NEAU Programming Contest 2020~~ H. 排序

本文解析了一个算法竞赛题目,涉及数列处理、排序算法和贪心策略。通过分析函数g(x),利用排序后的数列和贪心策略求解最小化问题,并提供了一段C++代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

给你两个长度均为n的数列ai​和bi​,定义函数
在这里插入图片描述
你可以改变ai​内各元素的顺序,使g(n)最小,求这个最小值。由于答案很大,请输出答案对109+7取余后的值

输入描述

输入的第一行为一个整数T,代表测试用例的组数
接下来的T组测试用例按照如下格式给出:每组数据占3行,第一行有2个整数n,表示数组长度,第二行有n个整数ai​,第三行有n个整数bi​

输出描述

对于每组测试数据,在新的一行中输出答案,由于答案很大,请输出答案对109+7取余后的结果

数据范围
>1≤T≤10001≤T≤10001≤T≤10002≤n≤2⋅1052≤n≤2\cdot{10}^52≤n≤2⋅105∑n≤2⋅105\sum{n}≤2\cdot{10}^5∑n≤2⋅1051≤ai≤1061≤a_i≤10^61≤ai​≤1061≤bi≤1061≤b_i≤10^61≤bi​≤106
样例输入

1
2
7 17
77 77

样例输出

3696

样例解释
在这里插入图片描述
首先对g(x)进行分析,对于一个固定的i,f(l,i) 有 i 个,f(i,r)有n-i+1个,所以包含ai*bi 的f(l,r)有i * (n-i+1) 个。所以

for(int i = 1; i <= n; ++ i) {
	g(n) += i * (n - i + 1) * ai * bi;
}

而且b[n]是固定的,所以对a进行排序,采用贪心策略即可。代码如下:

#include<bits/stdc++.h>

using namespace std;
const int maxn = 1e6+1;
const int mod = 1e9+7;
long long a[maxn], b[maxn];

int main() {
    int T;
    scanf("%d", &T);
    while(T--) {
        int n;
        scanf("%d", &n);
        for(int i = 1; i <= n; ++ i) {
            scanf("%lld", &a[i]);
        }
        for(int i = 1; i <= n; ++ i) {
            scanf("%lld", &b[i]);
        }
        for(int i = 1; i <= n; ++ i) {
            b[i] *= 1ll * i * (n-i+1);
        }
        sort(a+1, a+n+1, greater<int>());
        sort(b+1, b+n+1);
        long long sum = 0;
        for(int i = 1; i <= n; ++ i) {
            b[i] = b[i] % mod;
            sum = (sum + a[i] * b[i] % mod) % mod;
        }
        printf("%lld\n", sum % mod);
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值