一看数据范围, $1 le n le 100 $,此时不枚举更待何时?(雾)
注意获胜是指小(A)的票数大于小(B)的票数,而不是大于等于。(原谅作者语文不好(qwq))
Code
#include<bits/stdc++.h>
using namespace std;
int n;
int a[110];
int sum1,sum2;
bool comp(int a,int b)//自定义排序函数,从大到小排
{
return a>b;
}
int main()
{
ios::sync_with_stdio(false);
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i],sum1+=a[i];//预处理小B的票数
sort(a+1,a+n+1,comp);//因为k>=max{ai},所以考虑先排序
for(int k=a[1];;k++)
{
sum2=0;//一定要初始化!
for(int i=1;i<=n;i++)
sum2+=k-a[i];//每个人投给小A的票数就是每个人可以投的票数减去每个人投给小B的票数
if(sum2>sum1)//是>不是>=
{
cout<<k;
return 0;
}
}
return 0;
}
观察一下代码,我们发现可以在求小(A)的票数部分做一些小小的优化
观察可以发现,(sum2)=(sum_{i=1}^{n}(k-a_{i}))
原式
(=) (k imes n-sum_{i=1}^{n}a_{i})
(=) (k imes n-sum1)
于是在求小(A)的票数部分可以优化到(O(1))复杂度
Code
#include<bits/stdc++.h>
using namespace std;
int n;
int a[110];
int sum1,sum2;
bool comp(int a,int b)
{
return a>b;
}
int main()
{
ios::sync_with_stdio(false);
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i],sum1+=a[i];
sort(a+1,a+n+1,comp);
for(int k=a[1];;k++)
{
sum2=k*n-sum1;//求小A的票数,当然你也可以不用再设一个变量直接比较
if(sum2>sum1)
{
cout<<k;
return 0;
}
}
return 0;
}
接下来我们再观察一下这个程序,我们发现,这个程序其实就要求最小的(k),使得(k)满足(k imes n-sum1>sum1)
这不就是一个不等式吗
移项: (k imes n>2 imes sum1)
系数化一: (k>2 imes sum1 /n)
于是在求答案的部分就可以优化到(O(1))复杂度
#include<bits/stdc++.h>
using namespace std;
int n;
int a[110];
int sum1;
bool comp(int a,int b)
{
return a>b;
}
int main()
{
ios::sync_with_stdio(false);
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i],sum1+=a[i];
sort(a+1,a+n+1,comp);
if(2*sum1/n+1<a[1]) cout<<a[1];//因为k要>=max a[i],所以如果2*sum/n+1<a[1]要输出a[1]
else cout<<2*sum1/n+1;
return 0;
}