https://codeforces.com/contest/1113/problem/B

思想不难,但是在比较大小的时候,我选择了很笨的方法,我用两个数变化之后的差值大小来进行选择,然后最后再进行数组的更改,最后求和。

实际上,可以先求和,在每次运算之前,减去两个数,然后再把处理后的两个数加上,比较和的大小。

#include<bits/stdc++.h>
using namespace std;
int n;
vector<int> num;
vector<int> isPrime(int d){
    vector<int> res;
    for(int i=1;i*i<=d;i++){
        if(d%i==0){
            res.push_back(i);
            if(i!=d/i)
                res.push_back(d/i);
        }
    }
    return res;
}
int main(){
    cin>>n;
    num.resize(n);
    for(int i=0;i<n;i++)
        cin>>num[i];
    int sum=accumulate(num.begin(),num.end(),0);
    int minNum=*min_element(num.begin(),num.end());
    int ress=sum;
    for(int i=0;i<num.size();i++){
        vector<int> res=isPrime(num[i]);
        for(int j=0;j<res.size();j++){
            int c=res[j];
            int tmpSum=sum-minNum-num[i];
            tmpSum+=minNum*c+num[i]/c;
            ress=min(ress,tmpSum);
        }    
    }
    cout<<ress<<endl;
    return 0;
}