CodeForces

来源:互联网 发布:随机森林优化 编辑:程序博客网 时间:2024/05/20 01:10

在第四个赛季之后,Sherlock和Moriary已经意识到他们之间的战斗的整体愚蠢,并决定继续在和平的信用卡游戏中的比赛。
这个游戏的规则很简单:每个玩家都带他最喜爱的n位信用卡。然后两位玩家一个一个地将他们的卡上写的数字命名。如果两位数字不相等,则数字较小的玩家将从另一名玩家中轻拍(通常用食指敲击前额)。例如,如果n = 3,Sherlock的卡是123,Moriarty的卡有321号,第一个Sherlock的名字1和Moriarty的名字3,所以Sherlock得到一个轻弹。然后他们都是数字2,所以没有人得到轻弹。最后,Sherlock命名3,而Moriarty命名1并获得轻拂。
当然,Sherlock会按照给予的顺序一个接一个地按诚实地命名数字,而Moriary,作为一个真正的小人,打算作弊。他将按其他顺序命名他的数字(但是,他不会改变每个数字的总数)。例如,如果Moriarty上面可以命名1,2,3,并且根本没有闪光,或者他可以命名2,3和1给Sherlock两个闪光灯。
您的目标是找出Moriarty可以获得的最低可能数量(没有人喜欢轻弹),以及Sherlock可以从Moriarty获得的最大可能数量的轻弹。注意,这两个目标是不同的,并且可以通过使用不同的策略来获得最佳结果。
输入
输入的第一行包含单个整数n(1≤n≤1000) - Sherlock和Moriarty卡将要使用的卡数。
第二行包含n位数 - Sherlock的信用卡号码。
第三行包含n位数 - Moriarty的信用卡号码。
输出
首先打印Moriarty将获得的最小可能数量的轻弹。然后打印Sherlock可以从Moriarty获得的最大可能数量的轻弹。

输入
3
123
321
输出
0
2
输入
2
88
00
输出
2
0
注意

第一个样本在问题陈述中详细阐述。在第二个样本中,没有办法Moriarty可以避免两次轻弹。

思路:写完本体之后,发现hdu拿到田忌赛马数据水了,坑人;

第一种情况:从起点贪心,遇到a[i]<b[i]时,果断让a[i]消耗b最大的值,之需保证输的少即可;

第二种情况:从末端贪心,田忌赛马的思想;(hdu那道数据水了)

#include<cstdio>#include<cstring>#include<algorithm>#define max_n 1010using namespace std;int a[max_n],b[max_n];char str1[max_n],str2[max_n];int main(){int n,i,j;while(scanf("%d",&n)!=EOF){getchar();scanf("%s",str1);getchar();scanf("%s",str2);for(int i=0;i<n;i++){b[i]=str1[i]-'0';a[i]=str2[i]-'0';}if(n==1){if(a[0]>b[0])printf("0\n1\n");else printf("1\n0\n");continue;} sort(a,a+n);sort(b,b+n);//for(int i=0;i<n;i++)//printf(" %d",b[i]);//printf("\n");//for(int i=0;i<n;i++)//printf(" %d",a[i]);//printf("\n");int lose=0,win=0,t=0,tj=n-1,g=0,gw=n-1,ans=0;for(;t<=tj;){if(a[t]>=b[g]){t++;g++;}else if(a[t]<b[g]){ans++;t++;gw--;}}lose=0,win=0,t=0,tj=n-1,g=0,gw=n-1;for(;t<=tj;){if(a[tj]>b[gw]){win++;tj--;gw--;}else if(a[tj]<b[gw]){lose++;t++;gw--;}else if(a[tj]==b[gw]) {if(a[t]>b[g]) {t++;g++;win++;}else if(a[t]<b[g]){lose++;t++;gw--;}else if(a[t]==b[g]){if(a[t]==b[gw]){t++;gw--;}else{lose++;t++;gw--;}}}}printf("%d\n%d\n",ans,win);}return 0;}

1 0
原创粉丝点击