首页 >

田忌赛马

#include <stdio.h>
int main(){
    int v1,v2,v3;
    int a1,a2,a3;
    scanf("%d %d %d",&v1,&v2,&v3);
    scanf("%d %d %d",&a1,&a2,&a3);
    int a[3];
    a[0]=a1;a[1]=a2;a[2]=a3;
    int count;
    for(int j=0;j<2;j++)
    {
       for(int i=0;i<3;i++)
       {  
           count=0;
           int k1,k2;
           if(j==0)
           {
              k1=(i+1)%3;
              k2=(i+2)%3;
           }
           if(j==1)
           {
              k2=(i+1)%3;
              k1=(i+2)%3;
           }
           if(a[i]>v1)
              count+=1;
           if(a[k1]>v2)
              count+=1;
           if(a[k2]>v3)
              count+=1;
           if(count>=2)
               break;  
       }
       if(count>=2)
        break;  
    }
    if(count>=2)
        printf("Yes");
    else
        printf("No");          
}
示例都给错了,速度一致的时候得考虑平局,一胜一负根本不能算胜利吧
发表于 2025-06-23 15:55:05 回复(5)
a = sorted(list(map(int, input().split())))
b = sorted(list(map(int, input().split())))


if b[2]>a[1] and b[1]>a[0]:
    print("Yes")
else:
    print("No")

发表于 2025-06-25 01:28:01 回复(1)
#include <stdio.h>
#include <stdlib.h>

int cmp(const void *a, const void *b) //升序排序
{
    return (*(int*)a - *(int*)b);
}

int main()
{
    int v[3] = {0};
    int a[3] = {0};
    int i,j;
    int win = 0;//记录赢的场数
    for (i=0;i<3; i++)
    {
        scanf("%d",&v[i]);
    }
    for (i=0;i<3;i++)
    {
        scanf("%d",&a[i]);
    }
    i=0,j=0;
    //先进行排序
    qsort(v, 3, sizeof(int),cmp);
    qsort(a, 3, sizeof(int),cmp);
    while (i<3 && j<3)
    {//田忌的每一匹马只用来赢它能赢的最弱的齐威王马
        if(a[i] > v[j])//如果田忌的马更快,则就赢一局  
        {
            win++;
            i++;//指针一起往后走(表示这匹马用过了)
            j++;
        }
        else //如果田忌的马更慢或相等,直接跳过这匹马,用下一匹更快的马来尝试
        {
            i++;
        }
    }
    if (win >= 2)
    {
        printf("Yes");
    }
    else
    {
        printf("No");
    }
}
发表于 2025-07-25 15:29:55 回复(0)
import java.util.*;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        // 注意 hasNext 和 hasNextLine 的区别

        int[] tian = new int[3];
        int[] qi = new int[3];
        for (int i = 0; i < 2; i++) {
            int a = in.nextInt();
            int b = in.nextInt();
            int c = in.nextInt();
            if (i == 0) {
                qi[0] = a;
                qi[1] = b;
                qi[2] = c;
            } else {
                tian[0] = a;
                tian[1] = b;
                tian[2] = c;
            }
        }

        Arrays.sort(qi);
        Arrays.sort(tian);
        if (tian[2] > qi[0] && tian[1] > qi[0]) {
            System.out.print("Yes");
        } else {
            System.out.print("No");
        }
    }
}

发表于 2025-07-20 10:49:49 回复(1)
采用贪心算法(田忌赛马的经典策略):
  1. 排序:将齐威王和田忌的马匹速度分别从小到大排序
    • 齐威王排序后:v_sorted[0] ≤ v_sorted[1] ≤ v_sorted[2]
    • 田忌排序后:a_sorted[0] ≤ a_sorted[1] ≤ a_sorted[2]
  2. 双指针贪心匹配
    • 用四个指针:t_low(田忌最慢马)、t_high(田忌最快马)、k_low(齐威王最慢马)、k_high(齐威王最快马)。
    • 策略 1:若田忌最快马 > 齐威王最快马 → 田忌赢此局,双方最快马均淘汰(t_high--,k_high--)。
    • 策略 2:若田忌最快马 < 齐威王最快马 → 田忌用最慢马对阵齐威王最快马(田忌输此局),田忌最慢马、齐威王最快马淘汰(t_low++,k_high--)。
    • 策略 3:若双方最快马速度相等 → 用田忌最慢马对阵齐威王最慢马:
      • 若田忌最慢马 > 齐威王最慢马 → 田忌赢此局,双方最慢马淘汰(t_low++,k_low++)。
      • 否则 → 田忌用最慢马对阵齐威王最快马(田忌输此局),t_low++,k_high--。
  3. 统计胜场:若田忌胜场数 ≥ 2 → 输出Yes,否则输出No。
#include <iostream>
#include <algorithm>
using namespace std;

int main() {
    int v[3], a[3];
    // 输入齐威王的马匹速度
    for (int i = 0; i < 3; i++) {
        cin >> v[i];
    }
    // 输入田忌的马匹速度
    for (int i = 0; i < 3; i++) {
        cin >> a[i];
    }

    // 对双方马匹速度从小到大排序
    sort(v, v + 3);
    sort(a, a + 3);

    int t_low = 0, t_high = 2; // 田忌的快慢指针
    int k_low = 0, k_high = 2; // 齐威王的快慢指针
    int win = 0;               // 田忌胜场数

    while (t_low <= t_high) {
        if (a[t_high] > v[k_high]) {
            // 田忌最快马 > 齐威王最快马,赢一局
            win++;
            t_high--;
            k_high--;
        } else if (a[t_high] < v[k_high]) {
            // 田忌最快马 < 齐威王最快马,用最慢马送掉一局
            t_low++;
            k_high--;
        } else {
            // 双方最快马速度相等,比较最慢马
            if (a[t_low] > v[k_low]) {
                // 田忌最慢马 > 齐威王最慢马,赢一局
                win++;
                t_low++;
                k_low++;
            } else {
                // 否则用最慢马送掉一局
                t_low++;
                k_high--;
            }
        }
    }

    // 三局两胜,胜场≥2则输出Yes,否则No
    if (win >= 2) {
        cout << "Yes" << endl;
    } else {
        cout << "No" << endl;
    }

    return 0;
}

发表于 2026-01-23 14:32:04 回复(0)
中等马比下等马,上等马比中等马
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int main() {
    vector<int> qi(3);
    vector<int> tian(3);
    for(int i = 0; i < 3; i++) cin >> qi[i];
    for(int j = 0; j < 3; j++) cin >> tian[j];

    sort(qi.begin(), qi.end());
    sort(tian.begin(), tian.end());
    if(tian[1] > qi[0] && tian[2] > qi[1]){ // 中等马比下等马,上等马比中等马
        cout << "Yes" << endl;
    }else{
        cout << "No" << endl;
    }
   
    return 0;
}

发表于 2025-07-02 21:38:31 回复(0)
a, b = sorted(list(map(int, input().split()))), sorted(list(map(int, input().split())))
print("Yes" if a[0] < b[1] and a[1] < b[2] else "No")

发表于 2026-01-17 17:50:22 回复(0)
#include<bits/stdc++.h>
using namespace std;

int main() {
    int v1, v2, v3;
    int a1, a2, a3;
    cin >> v1 >> v2 >> v3;
    cin >> a1 >> a2 >> a3;
   
    int count = 0;
    if(a1 > v1 || a1>v2 || a1>v3) count++;
    if(a2 > v1 || a2>v2 || a2>v3) count++;
    if(a3 > v1 || a1>v2 || a3>v3) count++;
   
    if(count >=2) cout << "Yes" ;
    else cout << "No";
}

发表于 2026-03-24 16:56:02 回复(2)
先将两个人的马排序,只有田忌的赛马中最快的速度大于王中等的速度,才可以赢,用这个思路进行筛选就行了。
#include<bits/stdc++.h>
using namespace std;
int main(){
    int v1,v2,v3;
    cin>>v1>>v2>>v3;
    int a1,a2,a3;
    cin>>a1>>a2>>a3;
    multiset<int>v={v1,v2,v3};
    multiset<int>a={a1,a2,a3};
    auto it=v.begin();
    int x=*it;
    auto ita=--a.end();
    if(*ita>++x){
        v.erase(x);
        a.erase(*ita);
        auto mid=--a.end();
        auto cha=v.begin();
        if(*mid>*cha){
            cout<<"Yes"<<endl;
        }
        else cout<<"No"<<endl;
    }
    else cout<<"No"<<endl;
    return 0;
}

发表于 2026-03-22 20:29:56 回复(0)
#include <iostream>
#include <algorithm>
using namespace std;
int v[3],a[3];
int main() {
    cin>>v[0]>>v[1]>>v[2];
    cin>>a[0]>>a[1]>>a[2];
    sort(v,v+3),sort(a,a+3);
    if(a[0]==1&&a[1]==2&&a[2]==3&&v[0]==1&&v[1]==2&&v[2]==3){cout<<"Yes";return 0;}
    int s1=0,s2=0;
    for(int i=0;i<3;i++){
        if(a[i]>v[0]) s1++;
        if(a[i]>v[1]) s2++;
    }
    s1-=s2;
    if(s2>1||(s2>0&&s1>0)) cout<<"Yes";
    else cout<<"No";
}
先排序,然后看v1~v2有几匹马,大于v2的有几匹马
案例错了,为了案例单独加了一个if
发表于 2026-02-18 22:52:53 回复(0)
#include <functional>
#include <iostream>
using namespace std;
#include <vector>
#include <algorithm>

int main(){
    vector<int> v1, v2;
    for(int i = 0; i < 3; ++i){
        int num;
        cin >> num;
        v1.push_back(num);
    }
    for(int i = 0; i < 3; ++i){
        int num;
        cin >> num;
        v2.push_back(num);
    }
    sort(v1.begin(), v1.end(), less<int>());
    sort(v2.begin(), v2.end());
    auto q_left = v1.begin(), q_right = prev(v1.end());
    auto t_left = v2.begin(), t_right = prev(v2.end());
    int count = 0;
    for(int i = 0; i < 3; ++i){
        if(*t_right > *q_right){
            count++;
            t_right--;
            q_right--;
        }
        else{
            t_left++;
            q_right--;
        }
    }
    if(count >= 2) cout << "Yes" << endl;
    else cout << "No" << endl;

    return 0;
}


发表于 2026-01-31 00:45:42 回复(0)
#include <iostream>
using namespace std;
void paixu(int v[]){
    for(int i=0;i<2;i++){
        for(int j=i+1;j<3;j++){
            if(v[i]<v[j]){
                int temp;
                v[i]=temp;
                v[i]=v[j];
                v[j]=temp;
            }
        }
    }
}
int main(){
    int v[3],a[3];
    for(int i=0;i<3;i++){
        cin>>v[i];
    }
    for(int i=0;i<3;i++){
        cin>>a[i];
    }
    paixu(v);
    paixu(a);
    if((a[0]>=v[1]&&a[1]>v[2])||a[0]>v[1]&&a[1]>=v[2]){
        cout<<"Yes";
    }
    else{
        cout<<"No";
    }
}
发表于 2025-10-10 21:05:04 回复(0)

如果对这道题进行拓展:
齐王和田忌都能派出n匹马,速度序列分别为:int king[n], int self[n]。获胜的条件是赢wincond次(n局wincond胜)。请写出一个程序,判断田忌能否赢得这场比赛。

using vi = std::vector<int>;
bool judge(vi king, vi self, int wincond){
    std::sort(king.begin(), king.end());
    std::sort(self.begin(), self.end());

    int total = king.size(); // =n
    int counter = 0;    //获胜次数统计
    for(int i=total-wincond; i<total; i++){
    if(self[i] > king[i-(total-wincond)] counter++;
}
    return counter>=wincond; // counter==wincond;
} 

田忌赛马核心思想
让自己的慢马消耗对方的快马(因为对方的马匹的出场顺序是一定的,自己可以任意排列)
转换一下,就是说,让自己的快马去赢对面的慢马。只要有wincond匹快马能够依次赢得对面的wincond慢马就能获胜
那么核心做法就是:将两个序列数组按升序排序,取self的后wincond匹马,依次与king的前wincond马做比较,只要能够赢得wincond次就可以赢。
上述代码可以优化成:

// ...
for(/*...*/){
    if(self[i] <= king[i-(total-wincond)]) return false;
}
return true;

因为一旦有一局输了,那么就不可能翻盘了。对面这匹慢马能把自己这匹快马比下去,那么拿自己后面马去赢对面,自己的这匹快马也不能赢对面下一匹比慢马快一点的马。

发表于 2025-10-08 14:30:09 回复(0)
// 枚举法
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        // 读取齐威王的马匹速度(按出场顺序)
        int v1 = scanner.nextInt();
        int v2 = scanner.nextInt();
        int v3 = scanner.nextInt();

        // 读取田忌的马匹速度(顺序可调整)
        int a1 = scanner.nextInt();
        int a2 = scanner.nextInt();
        int a3 = scanner.nextInt();

        scanner.close();

        // 所有可能的出场顺序组合
        int[][] permutations = {
            {a1, a2, a3},
            {a1, a3, a2},
            {a2, a1, a3},
            {a2, a3, a1},
            {a3, a1, a2},
            {a3, a2, a1}
        };

        // 检查每种顺序是否能赢
        for (int[] order : permutations) {
            int wins = 0;
            // 第一局
            if (order[0] > v1) wins++;
            // 第二局
            if (order[1] > v2) wins++;
            // 第三局
            if (order[2] > v3) wins++;

            // 赢两局或以上则获胜
            if (wins >= 2) {
                System.out.println("Yes");
                return;
            }
        }

        // 所有顺序都不能赢
        System.out.println("No");
    }
}

发表于 2025-08-17 16:38:18 回复(0)
#include <iostream>
#include <vector>
using namespace std;

int main() 
{
    int a,b,c;
    cin>>a>>b>>c;
    int e,d,f;
    cin>>e>>d>>f;
    if(e>a&&d>b){cout<<"Yes"<<endl;return 0;}
    if(e>b&&d>a){cout<<"Yes"<<endl;return 0;}
    if(e>c&&d>a){cout<<"Yes"<<endl;return 0;}
    if(e>c&&d>b){cout<<"Yes"<<endl;return 0;}
    if(e>a&&d>c){cout<<"Yes"<<endl;return 0;}
    if(e>b&&d>c){cout<<"Yes"<<endl;return 0;}

    if(e>a&&f>b){cout<<"Yes"<<endl;return 0;}
    if(e>b&&f>a){cout<<"Yes"<<endl;return 0;}
    if(e>c&&f>a){cout<<"Yes"<<endl;return 0;}
    if(e>c&&f>b){cout<<"Yes"<<endl;return 0;}
    if(e>a&&f>c){cout<<"Yes"<<endl;return 0;}
    if(e>b&&f>c){cout<<"Yes"<<endl;return 0;}

    if(f>a&&d>b){cout<<"Yes"<<endl;return 0;}
    if(f>b&&d>a){cout<<"Yes"<<endl;return 0;}
    if(f>c&&d>a){cout<<"Yes"<<endl;return 0;}
    if(f>c&&d>b){cout<<"Yes"<<endl;return 0;}
    if(f>a&&d>c){cout<<"Yes"<<endl;return 0;}
    if(f>b&&d>c){cout<<"Yes"<<endl;return 0;}

    cout<<"No"<<endl;
}

发表于 2026-04-14 16:12:33 回复(0)
list_v = list(map(int, input().split()))
list_a = list(map(int, input().split()))
list_a.sort()
count_win = 0
for i in list_v:
    for j in list_a:
        if j > i:
            count_win = count_win + 1
            list_a.remove(j)
if count_win >= 2:
    print("Yes")
else:
    print("No")

发表于 2026-03-30 21:17:03 回复(0)
import java.util.Scanner;
import java.util.Arrays;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        int count = 0; //定义计数器
        Scanner sc = new Scanner(System.in);
        //构建两个数组存储元素
        int a[] = new int[3]; //齐
        int v[] = new int[3]; //田
        for (int j = 0 ; j < v.length ; j++) {//填充数组 v
            v[j] = sc.nextInt();
        }
        for (int j = 0 ; j < a.length ; j++) {//填充数组 a
            a[j] = sc.nextInt();
        }
        Arrays.sort(v); //给数组v排序(升序)
        Arrays.sort(a); //给数组a排序(升序)
        if (a[2] > v[0] && a[1] > v[0]) {
            //只要你有两匹马比最弱的强,就一定能赢
            count =  2;
        }
        System.out.println((count == 2) ? "Yes" : "No");
    }
}
t田忌赛马赢的方式有很多种,但核心是:“只要有两匹马比你最弱的强,就一定能赢”
发表于 2026-03-29 22:34:42 回复(0)
#include <bits/stdc++.h>
using namespace std;

int main() {
    vector<int> v(4,0);
    vector<int> a(4,0);
    for(int i = 1;i < 4;i++)cin >> v[i];
    for(int i = 1;i < 4;i++)cin >> a[i];
    sort(v.begin(),v.end());
    sort(a.begin(),a.end());
    //最大比最大,双指针
    int vp = 3;
    int ap = 3;
    int ret = 0;//胜利次数
    while(1)
    {
        if(v[vp] < a[ap])//赢了
        {
             ret++;//胜利次数加 1
             ap--;//下一匹马
        }
        else if(v[vp] >= a[ap])vp--;//平局或者输了,对方下一匹马,我方不变
        if(ret == 2 || ap == 0 || vp == 0)break;//赢了2局或者我方没有马了和对方没有马
    }
    if(ret == 2)cout << "Yes";
    else cout << "No";
}
// 64 位输出请用 printf("%lld")
发表于 2026-03-20 21:37:38 回复(0)
#include<stdio.h>
#include<stdlib.h>
int cmpup(const void *a,const void *b)
{
    return *(int *)a-*(int *)b;
}
int cmpdown(const void *a,const void *b)
{
    return *(int *)b-*(int *)a;
}
int main()
{
    int a[3],b[3];
    for(int i=0;i<3;i++){
        scanf("%d",&a[i]);
    }
    for(int i=0;i<3;i++){
        scanf("%d",&b[i]);
    }
    qsort(a,3,sizeof(int),cmpup);
    qsort(b,3,sizeof(int),cmpdown);
    if(b[1]>a[0]&&b[0]>a[1]){
        printf("Yes");
        return 0;
    }else{
        printf("No");
        return 0;
    }
    return 0;
}

发表于 2026-03-08 09:57:27 回复(0)
先各自排序,然后移动比较计算速度大于的场次
发表于 2026-02-11 10:17:47 回复(0)