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; }