首页 > 其他分享 >[ABC173E] Multiplication 4

[ABC173E] Multiplication 4

时间:2024-02-26 11:57:22浏览次数:26  
标签:f1 f2 get int double ans Multiplication ABC173E

这到题有两个需要注意的点:

1.两个1e9量级的数字的比值,用double的精度是不够的,要用double

2.这道题需要输出数学意义上取模的值,需要(ans+mod)%mod转化成正数

这道题测试点巨多,有整整四十个

#include <iostream>
#include <stdio.h>
#include <algorithm>
#include <string>
#include <cmath>
#define For(i, j, n) for (int i = j; i <= n; ++i)
using namespace std;
typedef long long LL;

const int N = 2e5 + 5;
const double INF = -1e10;
const LL mod = 1e9 + 7;

int n, k;
LL a[N];

bool cmp(int a, int b)
{
    return abs(a) > abs(b);
}

LL get_min()
{
    LL ans = a[n];
    for (int i = n - 1; i >= n - k + 1; i--)
    {
        ans = ans * a[i] % mod;
    }
    return ans;
}

LL get_max(int b, int tar)
{
    LL ans = a[1];
    for(int i = 2; i <= k; i++)
    {
        if(i != b)
        {
            ans = ans * a[i] % mod;
        }
    }
    if(b != -1)
        ans = ans * a[tar] % mod;
    return ans;
}

int main()
{
    scanf("%d%d", &n, &k);
    for (int i = 1; i <= n; i++)
        scanf("%lld", &a[i]);
    sort(a + 1, a + n + 1, cmp);
    int cnt = 0, p1 = -1, p2 = -1, m1 = -1, m2 = -1;
    LL ans = 1;
    for (int i = 1; i <= k; i++)
        if (a[i] < 0)
            cnt++;
    if (cnt & 1) // 绝对值最大的k个数字只能得到负数
    {
        for (int i = k; i; i--)
        {
            if (p1 != -1 && m1 != -1)
                break;
            if (p1 == -1 && a[i] > 0)
                p1 = i;
            if (m1 == -1 && a[i] < 0)
                m1 = i;
        }
        for (int i = k + 1; i <= n; i++)
        {
            if (p2 != -1 && m2 != -1)
                break;
            if (p2 == -1 && a[i] > 0)
                p2 = i;
            if (m2 == -1 && a[i] < 0)
                m2 = i;
        }
        long double f1 = INF, f2 = INF;
        if(m1!=-1&&p2!=-1)
            f1 = (long double)a[p2]/(long double)(-a[m1]);
        if(p1!=-1&&m2!=-1)
            f2 = (long double)(-a[m2])/(long double)a[p1];
        if (f1==INF&&f2==INF) // 无法得到正数
        {
            ans = get_min();
        }
        if(f1 > f2)
            ans = get_max(m1, p2);
//-------------------------------------------------------------------------------------------------------
        else if(f1 < f2) //这里不能只写if,否则在无法得到正数的情况下,会把答案从get_min替换成这个get_max
            ans = get_max(p1, m2);
//-------------------------------------------------------------------------------------------------------
    }
    else
        ans = get_max(-1, -1);
    printf("%lld\n", (ans + mod) % mod);
    return 0;
}

 

标签:f1,f2,get,int,double,ans,Multiplication,ABC173E
From: https://www.cnblogs.com/smartljy/p/18034006

相关文章

  • SciTech-Mathmatics-Multiplication Properties
    https://byjus.com/maths/multiplication/Inmathematics,multiplicationisamethodoffindingtheproductoftwoormorenumbers.Itisoneofthebasicarithmeticoperations,thatweuseineverydaylife.Themajorapplicationwecanseeinmultiplicatio......
  • 【UVA 442】Matrix Chain Multiplication 题解(栈)
    假设您必须计算一个表达式,如ABCDE,其中A、B、C、D和E是矩阵。由于矩阵乘法是关联的,所以执行乘法的顺序是任意的。然而,所需的初等乘法的数量很大程度上取决于求值顺序您可以选择。例如,设A为5010矩阵,B为1020矩阵,C为205矩阵。有两个计算ABC的不同策略,即(AB)C和A(B*C)。第一个需要1500......
  • D. Sorting By Multiplication
    D.SortingByMultiplicationYouaregivenanarray$a$oflength$n$,consistingofpositiveintegers.Youcanperformthefollowingoperationonthisarrayanynumberoftimes(possiblyzero):choosethreeintegers$l$,$r$and$x$suchthat$1\lel......
  • 题解 POJ3318【Matrix Multiplication】
    postedon2022-10-2119:56:08|under题解|sourceproblem判断三个\(n\timesn\)的矩阵是否满足\(A\timesB=C\),\(n\leq500\)。solution随机一个行向量\(v\)。若\(a\timesb=c\),则有\(v\timesa\timesb=v\timesc\)(不充分)。显然相乘复杂度仅为\(O(n^2)\)。类似于......
  • [AGC061D] Almost Multiplication Table
    人类智慧。答案显然具有可二分性,考虑如何check。我们使用调整法,不妨设\(x_n<y_m\)(反着做同理),一开始我们令\(x_i=1,y_i=+\infty\)。每次我们期望让\(x\)不断变大,\(y\)不断变小,不断将它们调整到当前的上下界。具体的,每次令\(x_i=\max\{x_i,\max\lceil{a_{i,j}-k\overy......
  • POJ - 1651 Multiplication Puzzle(区间dp)
    题目大意:给你N个数,每次可以选择一个数进行剔除(第一个和最后一个不能选择),选出该数后,sum+=该数左边的数*该数*该数右边的数问最小的sum是多少解题思路:用dp[i][j]表示[i,j]区间被剔除得只剩下i,j的最小sumdp[i][j]=dp[i][k]+dp[k][j]+num[i]*num[k]*num[j]#include......
  • Creating double-precision integer multiplication with a quad-precision result fr
    Creatingdouble-precisionintegermultiplicationwithaquad-precisionresultfromsingle-precisionmultiplicationwithadouble-precisionresultRaymondC......
  • UVA 442 Matrix Chain Multiplication
    原题Vjudge题目大意模拟矩阵链乘的计算,如果出现错误就输出error,否则输出总共的乘法次数对于一个矩阵\(A(m\timesn),B(n\timesp)\)乘法次数为\(m\timesn\timesp......
  • poj1651 Multiplication Puzzle--区间dp
    原题链接:​​http://poj.org/problem?id=1651​​题意:给出N个数,每次从中抽出一个数(第一和最后一个不能抽),每次的得分为抽出的数与相邻两个数的乘积,直到只剩下首尾两个数为......
  • test cpu performance with matrix multiplication
    一需求:测试cpu计算性能二方法:1.使用一定规模方阵执行乘法运算,不需要保存结果。2.根据CPU核数开启线程执行乘法运算3.事先将线程执行任务放入线程对应的任务容器,然后开启线......