hdu 1052 Tian Ji -- The Horse Racing

题目真的是有点长。

题意:

两组相同数量的数字,两两对比不能重复使用,如果第一组的一个大于第二组的一个则加200分,小于减200分,等于不加不减。

思路:

先将两组都按照从小到大进行排列,贪心的思路记下来第一组比第二组大的数量。具体就是,当成两个指针,分别表示当前比较位置,

1. 如果第一个大于第二个则加分,两个指针均向后移动

2. 如果第一个等于第二个,则可能是平,不计分,但相等的时候我们可以先记录下来这个相等信息,因为如果这个数用来和对方大的数比较输了,可以换来自己的一个数大于对方这个数,得分也是0,但如果这时候平了,但是对方的大数,打败了自己方本来可以赢这个数的那个数,总体来说,己方输了一个数,所以最差的方式是相等,但如果让自己方一个数赢了,可能会挽救一次自己比输。于是,当两个数相等时,先将这个相等信息保存,如果后面有相等或者小于正在比较的,可以看看是否能大于这个数。同理,相等的时候先看一下之前的记录里是否有相等的记录。

3. 如果第一个小于第二个,看一下相等的记录里有咩有可以挽救一下的。不然,第二个指针不动,第一个继续向前。

最后总数减去第二个剩的没有比较的数量,就是第一个输了的个数。

写的比较乱,表达不明白,还是看代码吧。

#include<iostream>
#include<cmath>
#include<algorithm>
#include<cstdio>
#include<queue>
using namespace std;
int a[1010], b[1010];
int main()
{
    int n;
    while(cin>>n)
    {
	queue<int >q;
        if(n==0) break;
        for(int i=0;i<n;i++)
            cin>>a[i];
        for(int i=0;i<n;i++)
            cin>>b[i];
        sort(a,a+n);
        sort(b,b+n);
        int j=0;
        int eq=0;
        int sum=0;
        for(int i=0;i<n;i++)
        {
            if(a[i]>b[j])
            {
                sum++;
        	j++;
            }
            else if(a[i]==b[j])
            {
		 if(!q.empty()&&(a[i]>q.front()))
		 {
			sum++;
			q.pop();
		 }
		 else
		 {
			q.push(a[i]);
			j++;
		}
       		
       	    }
            else
            {
		 if(!q.empty()&&(a[i]>q.front()))
                 {
                        sum++;
                        q.pop();
                 }
            }
         }
         sum=sum-(n-j);
//    if(sum<0) cout<<0<<endl;
         cout<<sum*200<<endl;
     }    
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值