汇总见 http://blog.csdn.net/qyl916/article/details/12442283
这一部分的题目也很经典
第10题 重排干草 Restack
这种题要么0分要么满分,和《训练指南》的第一章例3几乎一样,通过代数分析将题目转化
最后变成求中位数的题目,O(n)还是O(nlogn)随意~
//BZOJ里出现了两道和这题几乎一样的题目
/*
错了两个点
修改数据类型
还是错这两个点
发现输出的数据类型没改..
AC
*/
void setio(string name){
string in_f=name+".in";
string out_f=name+".out";
freopen(in_f.c_str(),"r",stdin);
freopen(out_f.c_str(),"w",stdout);
}
const int maxn=100010;
LL a[maxn],b[maxn],c[maxn];
int main()
{
setio("restack");
int n;read(n);c[0]=0;
REP1(i,n){
scanf("%lld%lld",&a[i],&b[i]);
c[i]=c[i-1]+b[i]-a[i];
}
sort(c+1,c+n+1);
LL ans=0,x0=c[(n+1)/2];
REP1(i,n)
ans+=abs(c[i]-x0);
cout<<ans<<endl;
//REP1(i,n)writeln(c[i]);
//system("pause");
return 0;
}
第11题 奶牛集体照 photo
神题,代码很短。
因为被教训过之后就不能动了。假如A原来在B左边,出来晃了一次,跑到了B右边,那么它下一次又会在B左边,B往左晃也是同理。也就是A的初始位置在B左边等价于A在5张照片里出现在B左边的次数≥3.
map<int, int> pos[5];
int a[20010], n;
void setio(string name){
string in_f = name + ".in";
string out_f = name + ".out";
freopen(in_f.c_str(), "r", stdin);
freopen(out_f.c_str(), "w", stdout);
}
int cmp(int a,int b){
int cnt=0;
rep(i,5){
if (pos[i][a] < pos[i][b]) ++cnt;
}
return cnt>2;
}
int main()
{
setio("photo");
scanf("%d",&n);
rep(i, 5)
rep(j, n){
int x;scanf("%d",&x);
a[j]=x;
pos[i][x] = j;
}
sort(a, a + n, cmp);
rep(i, n) printf("%d\n", a[i]);
//while(1);
return 0;
}