• Codeforces Round #748 (Div. 3) D1. All are Same


    读题

    由题意知道,最终只能减到0。那么可将最小值代表为0,其他值减去最小值。接下来获取最大的k,k满足能将每个数减到0。

    场上思路

    既然k可能成立,也可能不成立,那么可以从a[i]的范围出发进行二分,如果这个k能成立,那么就贪心的向大走。

    反思

    场上思路没有考虑到k不存在充分性。换言之,代码无法实现,因为某个数不成立时,它的左边和右边可能都有能成立的k。

    解题思路

    由于数组a中的每个值最终都会变成最小值,考虑到使用a[i]-a[i-1]消除最小值的影响(联想拔苗助长

    容易发现减去的最大值是差值的最大公约数,而algorithm中的__gcd(a,b)可求a与b的最大公约数,且在b=0时输出a,可解决此问题。


    #include<cstdio>
    #include<iostream>
    #include<cmath>
    #include<algorithm>
    using namespace std;
    int n,a[50];
    bool isOk(){
        for(int i=1;i<=n;i++){
            if(a[i]!=a[1])return false;
        }
        return true;
    }
    int main(){
        int T;
        cin>>T;
        while(T--){
            cin>>n;
            int minn=10000000;
            for(int i=1;i<=n;i++){
                scanf("%d",&a[i]);
                minn=min(minn,a[i]);
            }
            if(isOk()){
                printf("-1
    ");
                continue;
            }
            int tmp;
            for(int i=1;i<=n;i++){
                a[i]-=minn;
                if(a[i]!=0)tmp=a[i];
            }
            for(int i=1;i<=n;i++){
                tmp=__gcd(tmp,a[i]);
            }
            printf("%d
    ",tmp);
        }
        return 0;
    }
    View Code
  • 相关阅读:
    去除文本多余空行
    自定义裁剪图片
    遍历文件目录下所有图片并保存到统一路径
    根据节点解析xml
    坐标转换——GCJ-02
    获取进程列表
    判断进程状态
    VSDK modify HDMI resolution
    mcspi
    TI RTOS
  • 原文地址:https://www.cnblogs.com/zbsy-wwx/p/15409506.html
Copyright © 2020-2023  润新知