USACO月赛题解 第三讲 排序

汇总见 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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值