每日一练之贪心算法(P2587)

洛谷——P2587 [ZJOI2008]泡泡堂

 两队人马进行比赛, 战斗力值各有差异, 如果一方获胜得两分,战平各得一分,失败不得分,求可取得的最佳战绩与最差战绩。

        思路:1)最强的打得过最强的就直接上;

                   2)最弱的打得过最弱的直接上;

                   3)我方最弱的打不过对方最弱的,送人头消耗对方最强的兵。这样我方就有效保留了一位战力强的兵。为什么是有效,因为已经打不过了,打最弱是挂,打最强也是挂呀,弱者也要死得其所。。。如果此时是打平呢?分析下得失,如果送人头消耗了最强的兵,则我方最强的兵至少对战最弱的兵可以获胜,这就更有优势;比如1,4与1,4;打平不如打消耗。

 1 #include<iostream>
 2 #include<algorithm>
 3 using namespace std;
 4 const int MAX=100001;
 5 int fight(int a[],int b[],int n,bool high);
 6 
 7 int main()
 8 {
 9     int a[MAX],b[MAX];
10     int n;
11     cin>>n;
12     for(int i=0;i<n;i++)    cin>>a[i];
13     for(int i=0;i<n;i++)    cin>>b[i];
14     sort(a,a+n);
15     sort(b,b+n);
16     cout<<fight(a,b,n,true)<<" "<<fight(b,a,n,false)<<endl;     //反复提交n次发现不要求分行,mmm
17 
18     return 0;
19 }
20 
21 int fight(int a[],int b[],int n,bool high)
22 {
23     int iLeft,iRight,jLeft,jRight,win;
24     iLeft=jLeft=0;
25     win=0;
26     iRight=jRight=n-1;
27     while(iLeft<=iRight&&jLeft<=jRight)
28     {
29         if(a[iRight]>b[jRight])        
30         {
31             win+=2;
32             iRight--;
33             jRight--;
34         }
35         else if(a[iLeft]>b[jLeft])
36         {
37             win+=2;
38             iLeft++;
39             jLeft++;
40         }
41         else if(a[iLeft]==b[jRight])        //相等则说明剩下的数都是相等的,即打平
42         {
43             win+=(iRight-iLeft+1);
44             break;
45         }
46         else    
47         {
48             iLeft++;
49             jRight--;
50         }
51     }
52     if(high)    return win;        //如果high为真,求a队最高分
53     else    return (2*n-win);    //如果high为假,求a队最低分,此时b队得分最高,总分为2*n
54 }

 

提交了n遍就是不过,出现Wrong Answer Too short on line 1,后来对比别人的才发现输出时换行导致与要求格式不同。

小结:

1、提交前先上IDE确认能否通过;

2、不要盲目提交,分析原因 ( 比对结果格式/题目要求,分析对比他人结果);

3、方法总比问题多,放空思绪, 歇会再来。

转载于:https://www.cnblogs.com/maxonzou/p/10629020.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值