标签:style http color os io for ar 2014
For each case, first output the case number as "Case #x: ", and x is the case number. Then output a single number, representing the minimum number of trees lxhgww needs to move.
1 4 1 3 6 7
Case #1: 1
题解及代码:
#include <iostream> #include <cstdio> #include <cstring> #include <map> using namespace std; map<long long,int>Map; int main () { int cas,n; long long s[45]; scanf("%d",&cas); for(int ca=1;ca<=cas;ca++) { scanf("%d",&n); Map.clear(); for(int i=1;i<=n;i++) { scanf("%lld",&s[i]); if(Map.find(s[i])==Map.end()) Map[s[i]]=1; else Map[s[i]]++; } if(n==2) { printf("Case #%d: 0\n",ca); continue; } int ans=50; for(int i=1;i<=n;i++) { ans=min(ans,n-Map[s[i]]); for(int j=i+1;j<=n;j++) { long long dis=(s[i]>s[j])?s[i]-s[j]:s[j]-s[i]; if(dis==0) continue; for(int k=0;k<=n-2;k++) { if(dis%(k+1)) continue; long long di=dis/(k+1); long long c=min(s[i],s[j]); int cnt=0; for(int x=0;x<=k+1;x++) { if(Map.find(c)!=Map.end()) cnt++; c+=di; } ans=min(ans,n-cnt); } } } printf("Case #%d: %d\n",ca,ans); } return 0; } /* 这道题,因为n比较小而且至少有两棵树是不用动的,我们直接暴力枚举起点以及其后另外一点, 然后枚举两棵树之间树的数目,算好间距,模拟即可。 比赛的时候还在纠结,如果选定的起点在最优的情况下不是起点怎么办?后来发现自己多虑了。 假设我们选定的起点是i,另外一点是j(j>i),如果存在上述最优的情况起点在i左侧假设为k(k<i), 那么我们在进行暴力时,以k为起点,j为另一点的情况,已经计算过这种情况了。 所以这样讲,那我们每次枚举i的时候就不需要考虑左侧的树了,每次都是把左侧的树搬到右边来。 还有就是这道题一个比较坑的点:就是一个点上可以种很多树,稍微处理一下就可以了。 转载请注明出处,谢谢。 */
bnu 34982 Beautiful Garden,布布扣,bubuko.com
标签:style http color os io for ar 2014
原文地址:http://blog.csdn.net/knight_kaka/article/details/38616129