9. 倍数问题
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1e5;
ll nn,k,vis[maxn],tmp[maxn],num[maxn];
vector<ll>vc;
ll dfs(ll n)
{
if(n>=3)
{
ll t=tmp[0]+tmp[1]+tmp[2];
if(t%k==0)
vc.push_back(t);
}
else
for(int i=0;i<nn;i++)
if(vis[i]==0)
tmp[n]=num[i],vis[i]=1,dfs(n+1),vis[i]=0;
}
int main()
{
scanf("%lld%lld",&nn,&k);
memset(vis,0,sizeof(vis));
memset(num,0,sizeof(num));
memset(tmp,0,sizeof(tmp));
for(int i=0;i<nn;i++)
scanf("%lld",&num[i]);
dfs(0);
ll ans=0;
for(int i=0;i<vc.size();i++)
ans=max(ans,vc[i]);
printf("%lld\n",ans);
return 0;
}
10. 付账问题
#include<bits/stdc++.h>
using namespace std;
const int maxn = 5e5+5;
int a[maxn],n,s;
int main()
{
scanf("%d %d",&n,&s);
for(int i = 0;i<n;i++)
scanf("%d",&a[i]);
double avg=(double)s/n,ls=double(s),nowavg=avg,dis=0;
sort(a,a+n);
for(int i=0;i<n;i++)
{
if(a[i]<nowavg)
{
dis+=(a[i]-avg)*(a[i]-avg);
ls-=a[i];
nowavg=ls/(n-i-1);
}
else
{
dis+=(nowavg-avg)*(nowavg-avg);
ls-=nowavg;
}
}
printf("%.4lf\n",sqrt(dis/n));
return 0;
}
算法挑战:倍数与付账问题
本文探讨了两个有趣的算法问题:一是寻找数组中元素组合的最大倍数值;二是解决公平分配账单的数学挑战,通过计算平均分配偏差来评估分配方案的公平性。
882

被折叠的 条评论
为什么被折叠?



