贺州学院ivy


私信TA

用户名:Livy

访问量:5034

签 名:

好好学习,天天向上,汝何秀?

排  名 33
经  验 5945
参赛次数 5
文章发表 25
年  龄 0
在职情况
学  校 贺州学院
专  业 软件工程

  自我简介:

假猪套天下第一

解题思路:


   一开始看到是想到田忌赛马的故事,题目也就是按照田忌赛马的思路来求赢的最多场数

   这题我还真的是投机取巧AC的,原本想试试的而已,结果却AC了,我都笑了

  

   我的思路是这样的

   a是某君   ,b是钟神

   对a进行降序排序,对b进行升序排序,也就想按照田忌赛马的思想,下马对上马,中马对下马,上马对中马,这样子可以赢两场输一场赢50

   所以 对a进行降序排序,对b进行升序排序,

   然后单独对a[1]和b[1]进行比较,如果b[1]>a[1],那么win++;

   随后从下标2开始到下标n进行遍历

   如果a[i]<b[i],则win++

   最后输出win*50的数字


   接下来说说投机取巧就在这里

    如 输入   4  4 2 1 3  4 3 1 4

   排序对比后有

    a: 4 3 2 1       编一个序号为1-4好了 ,即a1我想表示为 4 ,a2表示为3,只是为了方便理解而已

    b: 1 3 4 4

     如果按照正常田忌赛马来想,肯定第一个就是 a1-4 对b1-1,第一场:用下马对上马,输了 

     第二场: 剩下    a: 3 2 1     b:  3 4 4,那肯定想到用b3-4对a1-3,赢了

     第三场: 剩下     a:  2 1     b:  3  4, 那肯定想到用a1-2对b1-3,赢了

     第四场: 剩下     a:   1     b:   4   ,那肯定赢了

     结果就是赢3输一     赢的钱就是 :3*50-1*50 = 100;

    

      如果按照我投机取巧的思路,只算赢的,也就是说,没有输,我只算赢的

      单独对排序后的 a[1]和b[1],对比,赢了就win++,输了或者平都没赢,就算输了我也不算输

     上面的例子

      a[1]和b[1]比较,很明显输了,但是我不算输,只算赢,没赢,所以win还是0

        随后从下标2开始到下标n进行遍历, 如果a[i]<b[i],则win++

        a[2] 和b[2] 平了,win+=0;

        a[3] 和b[3] 赢了,win++;

        a[4] 和b[4] 赢了,win++;

         所以最后赢了2局,输出就是win*50 = 2*50 = 100;


        结果和田忌赛马一样,所以这算是投机取巧了吧.............


注意事项:

参考代码:

#include<iostream>
#include<string.h>
#include<string>
#include<algorithm>
#include<functional>
#include<math.h>
using namespace std;
bool cmp(int a, int b){
        return a > b;
}
int main(){

          
            int n,i,j,win;//win是代表赢的场数
            int a[1000], b[1000];//a是存储某君的每辆车速度,b是存储钟神的每辆车速度
            while (cin >> n){
                       win = 0;//每次初始化为0
                       for (i = 1; i <= n; i++)cin >> a[i];
                       for (i = 1; i <= n; i++)cin >> b[i];
                       sort(a + 1, a + n,cmp);//降序排序
                       sort(b + 1, b + n);//默认升序,所以不用自己写cmp
                       if (a[1] < b[1])win++;
                       for (i = 2; i <= n; i++){
                                     if (a[i] < b[i])win++;
                       }
                       cout << win * 50 << endl;//输出赢的钱
             }
             return 0;
}

C语言网提供「C语言、C++、算法竞赛」在线课程,全部由研发工程师或ACM金牌退役选手亲自授课,以视频+配套题目的学练同步模式教学,强化动手,并提供增值服务!

  评论区

感觉还是应该像田忌赛马那题一样用贪心的
2019-03-07 00:56:12 | |
大家可以试试这个数据看能不能得到正确答案
6 1 2 3 4 5 6 2 3 4 5 6 7
每一场都可以赢,输出应该是300,用这个代码得到的是200
这个代码能不能通过我不知道,但是存在问题
2019-02-16 12:40:01 | |
  • «
  • 1
  • »