UVa11300——算法竞赛入门经典训练指南
(xl)LT1-3
这道题还是比较考验数学水平,由于所有的交换仅限于相邻两个人之间的交换,所以容易列n-1个方程组,要注意到这是一个环,所以第n个方程是可以被推导出来所以不能算作有效的方程组,即使无法解出所有的值,但是我们注意到,只要求一个最小值,那么这种求极值问题,就可以通过x1一个变量来表示所有的,即消元完成。这样转化为“单变量极值问题”。
然后就是显然的坐标上求啊求。。。再用显然的中位数就可解了。
然而编程的时候就是恶心,我一直以为我的式子可能错了,然而问题竟然是tot没有初始化,恶心啊恶心啊。。。所以一定要初始化一定要初始化!!!
附上代码:
#include<iostream> #include<cstdio> #include<algorithm> //#include<cmath> using namespace std; const int maxn=1000000+100; long long a[maxn],c[maxn]; int main() { int n; while(scanf("%d",&n)==1){ long long tot=0; //初始化,否则会生成一个固定的随机值。。。坑爹啊 for(int i=1;i<=n;i++){ scanf("%lld",&a[i]); tot+=a[i]; } long long ave=tot/n; c[0]=0; for(int i=1;i<n;i++){ c[i]=c[i-1]+ave-a[i+1]; // cout<<"C "<<i<<" :"<<c[i]<<endl; } sort(c,c+n); long long mid=c[n/2]; long long ans=0; for(int i=0;i<n;i++)ans+=abs(mid-c[i]); printf("%lld\n",ans); } return 0; }
在看书的时候发现了这样一个问题。fabs和abs区别是什么?需要什么库呢?似乎abs不需要额外的库。
库是不同的,然而其实只要加载cmath库,就都可以用了,他们区别在于fabs是浮点型,abs是整型(注意,取绝对值后再取整)。
当有那么一天,你相信你可以做到的时候,那你就真的能够做到!
路在脚下