题目:[汪老师结婚]婚礼上的袭击
题目描述
背景:雅礼中学信息组那英俊潇洒风流倜傥身高五尺玉树临风的汪老师要结婚的消息,如一重磅炸弹在众人耳旁炸响。但他的学生们却早已在阴影中悄悄策划了一个天大的阴谋…..
话说汪老师正喜气洋洋的在婚礼上傻笑,突然从门外冲进了N个他的学生:zhangrunzhou、yiming94、jimmyandhxm、pc、zw7840、行云流水、chensqi……大牛们每人手中都拿着一个臭不可闻的鸡蛋,向汪老师掷去。幸好英明神武的汪老师早就安排了间谍(yiming94),于是他老人家不慌不忙地从身后拿出N个刚从地摊上买来的盾牌,以防护学生扔来的臭鸡蛋。但因为各人的力量不同,且汪老师盾牌的质量也不同(谁叫他贪便宜买地摊货),只有汪老师的盾牌防御要高于鸡蛋的攻击力才算防守成功,所以汪老师在选择用哪个盾牌防御哪个鸡蛋的问题上发了愁,更何况汪老师的未婚妻还在一旁看着,汪老师每被击中一次,她对汪老师的好感就会下降200点;而每当汪老师成功防住一次,她对汪老师的好感就会上升200点(如果防御等于攻击,她对汪老师的好感不升也不降)。于是汪老师找来了智慧超群zrp,请他来帮着算一下怎样才能使汪老师的未婚妻对汪老师的好感最高。但由于zrp急着准备初二的生地会考,所以就只好请你来帮忙算一下。(汪老师的未婚妻的初始好感值为零,一个盾牌只能用一次)
输入格式
第一行一个数n 范围 n<=100000 以0结束 n表示汪老师的盾牌数量
第二行输入汪老师的n个盾牌的防御力
第三行大牛们的攻击力
(一次输入多组数据,当n为0时结束)
输出格式
一个数:汪老师未婚妻的好感(可能为负数)
题解:———————————————————————————————————————————————————
无疑,这是个好题目,因为我已在本题花了一节晚自习,我用的是贪心法,听说还可以用DP,恕我不才,贪心我就够呛了。
这道题目是经典的田忌赛马问题
1.当田忌最慢的马比齐王最慢的马快,赢一场先
2.当田忌最慢的马比齐王最慢的马慢,和齐王最快的马比,输一场
3.当田忌最快的马比齐王最快的马快时,赢一场先。
4.当田忌最快的马比齐王最快的马慢时,拿最慢的马和齐王最快的马比,输一场。
5.当田忌最快的马和齐王最快的马相等时,拿最慢的马来和齐王最快的马比.
代码实现:
#include<iostream>
using namespace std;
int a[100001],b[100001];
int main()
{
int i,j,k,n,total=0;
cin>>n;
while(n!=0)
{
total=0;
for(i=1;i<=n;i++)
cin>>a[i];
for(i=1;i<=n;i++)
cin>>b[i];
for(i=1;i<=n;i++)
for(j=1;j<i;j++)
{
if(a[i]<a[j]) swap(a[i],a[j]);
if(b[i]<b[j]) swap(b[i],b[j]);
}
int q1=1,q2=1,w1=n,w2=n;
for(i=1;i<=n;i++)
{
if(a[w1]>b[w2]) {total++;w1--;w2--;continue;} //具体的贪心我也不知道为什么是这样
if(a[q1]>b[q2]) {q1++;q2++;total++;continue;}
if(a[q1]>b[w2]) {total++;q1++;w2--;continue;}
if(a[q1]<b[w2]) {total--;w2--;q1++;continue;}
if(a[q1]==b[w2]) {q1++;w2--;continue;}
}
cout<<total*200<<endl;
cin>>n;
}
return 0;
}
值得纪念的是,我的AC量突破50啦!