好吃的鸭脖
【问题描述】
达瓦迷恋上了麻辣鸭脖,但是鸭脖太辣了,要靠牛奶解辣。给你n个鸭脖的辣度,以及n瓶牛奶的甜度。每瓶牛奶只能解一个鸭脖的辣,如果牛奶的甜度大于鸭脖的辣度,达瓦的幸福感就能得到1点的提升,相同幸福感不变,否则就会减少1点。
请你合理的分配牛奶,让达瓦的幸福度最高。
【输入形式】
包含多组数据,第一行一个整数T,表示数据组数。
每组数据的第一行,一个整数n
第二行,n个整数,鸭脖的辣度ai
第三行,n个整数,牛奶的甜度bi
1<= n <= 1000000
1<= ai, bi <= 2000
保证对于所有数据∑n<=1000000。
【输出形式】
每组数据一行,单独的一个整数,最高能达到的幸福感。
【样例输入】
2
4
2 3 8 9
1 4 7 10
5
2 23 21 4 56
6 7 33 42 1
【样例输出】
2
3
坑:(应该有很多的人和我一样)
这道题我第一次做的时候, 利用了田忌赛马的思想,把最大的辣度和最小的甜度进行抵消,依次进行,测试数据的时候都过的了,但是在测试系统中一直不能AC,所以我就很困惑,而且自己一直找不到那种特殊的情况,直到我某天想到了下面的一组数据:
辣度:1 10 20
甜度:2 11 21
这个方法不攻自破…
解法思路:
这道题需要求出给定辣度的鸭脖和甜度的牛奶能达到最高的幸福感,当辣度大于甜度的时候幸福感就减一,当甜度大于辣度的时候幸福感就加一。所以这道题有个解题思路就是先把给出的辣度和甜度从小到大排个序,然后利用贪心思想,把最小的辣度a1与甜度进行比较,找到最小的比a1大的甜度,然后幸福感加一,如果没找到就意味着没有比该辣度大的甜度了,所以幸福感减一。然后再把剩下的最小的辣度a2与甜度进行上述比较,以此类推a3、a4、a5…直至结束,最后再输出此时的幸福感。
#include<iostream>
#include<algorithm>
using namespace std;
int a[1000000]={0},b[1000000]={0};//a辣,b甜
bool bijiao(int a,int b)//从小到大
{
return a<b;
}
int main()
{
int t;
int n;
int flag;
cin>>t;
for(int k=0;k<t;k++)
{
cin>>n;
flag=0;
for(int i=0;i<n;i++)
{
cin>>a[i];
}
for(int i=0;i<n;i++)
{
cin>>b[i];
}
sort(a,a+n,bijiao);
sort(b,b+n,bijiao);
int y,z;
for(y=0;y<n;y++)
{
for(z=0;z<n;z++)
{
if(a[y]<b[z])
{
flag++;
b[z]=-1;
break;
}
if(a[y]>b[z-1]&&(z==n-1))//当最后一个甜度也比当前辣度小时,幸福感减一
flag--;
}
}
cout<<flag<<endl;
}
return 0;
}