刷题记录:牛客NC201628纸牌游戏
传送门:
题目描述:
今天你与你的挚友玩一种纸牌游戏,每一回合两人各出一张牌,如果你的牌点数大小比对方小,则你不得分, 否则你的得分为两张卡牌点数差值的绝对值。 由于你有读心术,你已经知道了对方接下来要出的n张牌,a1 a2 a3 ... an。 你手上也有n张牌 b1 b2 b3 ... bn,问你如何安排这n张牌使你得的分数最大? 输入: 1 1 2 输出: 1
主要思路: 这种题目的贪心思想可能不难吧,反正我一看到就觉得正反相减得到的答案应该是最优的,证明的话我就不证了,应该也是可以证的,有一种排序不等式的意味
注意点:该题需要开longlong, 刚开始交上去对了一半,搞的我很慌,感觉贪心思路错了??
#include <iostream> #include <cstdio> #include <cmath> #include <algorithm> #include <vector> #include <map> #include <set> #include <queue> #include <string.h> #include <stack> using namespace std; typedef long long ll; #define inf 0x3f3f3f3f #define root 1,n,1 #define lson l,mid,rt<<1 #define rson mid+1,r,rt<<1|1 inline ll read() { ll x=0,w=1;char ch=getchar(); for(;ch>9||ch<0;ch=getchar()) if(ch==-) w=-1; for(;ch>=0&&ch<=9;ch=getchar()) x=x*10+ch-0; return x*w; } #define maxn 1000000 int n; ll a[2000000]; ll b[2000000]; bool cmp(ll aa,ll bb) { return aa>bb; } int main() { n=read(); for(int i=1;i<=n;i++) a[i]=read(); for(int i=1;i<=n;i++) b[i]=read(); sort(a+1,a+n+1); sort(b+1,b+n+1,cmp); ll ans=0; for(int i=1;i<=n;i++) { if(b[i]>a[i]) { ans+=(b[i]-a[i]); } } cout<<ans<<endl; return 0; }