算法笔记_153:算法提高 判断名次(Java)

目录

1 问题描述

2 解决方案

 


1 问题描述

问题描述

  某场比赛过后,你想要知道A~E五个人的排名是什么,于是要求他们每个人说了一句话。(经典的开头……-_-!)得了第1名的人23,说了假话;得了第5名的人不好意思,也说了假话;为了使求解问题简单,第3名同样说了假话。(奇数名次说假话)

输入格式

  共5行,各行依次表示A~E说的话。
  每行包含一个形如“A>=3”的名次判断,即一个大写字母+关系运算符+一个数字,不包含空格。
  大写字母A~E,关系运算<、<=、=、>=、>、!=,数字1~5。注意:等于是“=”不是“==”!

输出格式

  可能有多解,请按照字典序输出排名序列,每个解一行
  最后一行输出解的数量

样例输入

A=2
D=5
E>3
A>2
B!=1

样例输出

ACDEB
AECBD
BADCE
BCADE
BDACE
CEADB
CEBDA
7


2 解决方案

具体代码如下:

import java.util.ArrayList;
import java.util.Collections;
import java.util.Scanner;

public class Main {
    public static String[] say = new String[5];
    public static ArrayList<String> temp = new ArrayList<String>();
    public static ArrayList<String> result = new ArrayList<String>();

    public void swap(char[] A, int i, int j) {
        char s = A[i];
        A[i] = A[j];
        A[j] = s;
    }

    public void dfs(char[] A, int step) {
        if(step == A.length) {
            StringBuilder s = new StringBuilder("");
            for(int i = 0;i < A.length;i++)
                s.append(A[i]);
            temp.add(s.toString());
        } else {
            for(int i = step;i < A.length;i++) {
                swap(A, i, step);
                dfs(A, step + 1);
                swap(A, i, step);
            }
        }
    }

    public boolean judge(int a, String o, int p, int b) {
        if(b == 1) {  //此次说话为真
            if(o.equals(">")) {
                if(a > p)
                    return true;
                else
                    return false;
            } else if(o.equals(">=")) {
                if(a >= p)
                    return true;
                else
                    return false;
            } else if(o.equals("=")) {
                if(a == p)
                    return true;
                else
                    return false;
            } else if(o.equals("!=")) {
                if(a != p)
                    return true;
                else
                    return false;
            } else if(o.equals("<")) {
                if(a < p)
                    return true;
                else
                    return false;
            } else if(o.equals("<=")) {
                if(a <= p)
                    return true;
                else
                    return false;
            }
        } else if(b == 0) {  //此次说话为假
            if(o.equals(">")) {
                if(a <= p)
                    return true;
                else
                    return false;
            } else if(o.equals(">=")) {
                if(a < p)
                    return true;
                else
                    return false;
            } else if(o.equals("=")) {
                if(a != p)
                    return true;
                else
                    return false;
            } else if(o.equals("!=")) {
                if(a == p)
                    return true;
                else
                    return false;
            } else if(o.equals("<")) {
                if(a >= p)
                    return true;
                else
                    return false;
            } else if(o.equals("<=")) {
                if(a > p)
                    return true;
                else
                    return false;
            }
        }
        return false;
    }

    public void getResult(int i, int j) {
        for(int t = 0;t < temp.size();t++) {
            String s = temp.get(t);
            boolean judge1 = true;
            for(int m = 0;m < 5;m++) {
                char a = say[m].charAt(0);
                String o = "";
                int p = say[m].charAt(say[m].length() - 1) - ‘0‘;
                if(say[m].length() == 3) {
                    o = o + say[m].substring(1, 2);
                } else {
                    o = o + say[m].substring(1, 3);
                }
                if(i == m || j == m) {
                    judge1 = judge(s.indexOf(a) + 1, o, p, 1);
                } else {
                    judge1 = judge(s.indexOf(a) + 1, o, p, 0);
                }
                if(judge1 == false)
                    break;
            }
            if(judge1 == false)
                continue;
            int a1 = s.indexOf((‘A‘+i));
            int a2 = s.indexOf((‘A‘+j));
            if((a1 == 1 && a2 == 3) || (a1 == 3 && a2 == 1)) {
                judge1 = true;
            } else {
                judge1 = false;
            }

            if(judge1 == true) {
                if(!result.contains(s))
                    result.add(s);
            }
        }
    }

    public static void main(String[] args) {
        Main test = new Main();
        String A = "ABCDE";
        char[] B = A.toCharArray();
        test.dfs(B, 0);
        Scanner in = new Scanner(System.in);
        for(int i = 0;i < 5;i++)
            say[i] = in.next();
        for(int i = 0;i < 5;i++) {
            for(int j = i + 1;j < 5;j++)
                test.getResult(i, j);
        }
        Collections.sort(result);
        for(int i = 0;i < result.size();i++)
            System.out.println(result.get(i));
        System.out.println(result.size());
    }
}
时间: 2024-11-03 05:42:45

算法笔记_153:算法提高 判断名次(Java)的相关文章

算法笔记_165:算法提高 道路和航路(Java)

目录 1 问题描述 2解决方案   1 问题描述 问题描述 农夫约翰正在针对一个新区域的牛奶配送合同进行研究.他打算分发牛奶到T个城镇(标号为1..T),这些城镇通过R条标号为(1..R)的道路和P条标号为(1..P)的航路相连. 每一条公路i或者航路i表示成连接城镇Ai(1<=A_i<=T)和Bi(1<=Bi<=T)代价为Ci.每一条公路,Ci的范围为0<=Ci<=10,000:由于奇怪的运营策略,每一条航路的Ci可能为负的,也就是-10,000<=Ci<

算法笔记_163:算法提高 最大乘积(Java)

目录 1 问题描述 2 解决方案   1 问题描述 问题描述 对于n个数,从中取出m个数,如何取使得这m个数的乘积最大呢? 输入格式 第一行一个数表示数据组数 每组输入数据共2行: 第1行给出总共的数字的个数n和要取的数的个数m,1<=n<=m<=15, 第2行依次给出这n个数,其中每个数字的范围满足:a[i]的绝对值小于等于4. 输出格式 每组数据输出1行,为最大的乘积. 样例输入 15 51 2 3 4 2 样例输出 48 2 解决方案 具体代码如下: import java.uti

算法笔记_166:算法提高 金属采集(Java)

目录 1 问题描述 2 解决方案   1 问题描述 问题描述 人类在火星上发现了一种新的金属!这些金属分布在一些奇怪的地方,不妨叫它节点好了.一些节点之间有道路相连,所有的节点和道路形成了一棵树.一共有 n 个节点,这些节点被编号为 1~n .人类将 k 个机器人送上了火星,目的是采集这些金属.这些机器人都被送到了一个指定的着落点, S 号节点.每个机器人在着落之后,必须沿着道路行走.当机器人到达一个节点时,它会采集这个节点蕴藏的所有金属矿.当机器人完成自己的任务之后,可以从任意一个节点返回地球

算法笔记_155:算法提高 概率计算(Java)

目录 1 问题描述 2 解决方案   1 问题描述 问题描述 生成n个∈[a,b]的随机整数,输出它们的和为x的概率. 输入格式 一行输入四个整数依次为n,a,b,x,用空格分隔. 输出格式 输出一行包含一个小数位和为x的概率,小数点后保留四位小数 样例输入 2 1 3 4 样例输出 0.3333 数据规模和约定 对于50%的数据,n≤5. 对于100%的数据,n≤100,b≤100. 2 解决方案 下面代码在系统中运行评分为90分,第五组数据无法通过,我用同版本的C代码运行(PS:具体参见文末

算法笔记_164:算法提高 最小方差生成树(Java)

目录 1 问题描述 2 解决方案   1 问题描述 问题描述 给定带权无向图,求出一颗方差最小的生成树. 输入格式 输入多组测试数据.第一行为N,M,依次是点数和边数.接下来M行,每行三个整数U,V,W,代表连接U,V的边,和权值W.保证图连通.n=m=0标志着测试文件的结束. 输出格式 对于每组数据,输出最小方差,四舍五入到0.01.输出格式按照样例. 样例输入 4 51 2 12 3 23 4 24 1 12 4 34 61 2 12 3 23 4 34 1 12 4 31 3 30 0 样

算法笔记_156:算法提高 6-17复数四则运算(Java)

目录 1 问题描述 2 解决方案   1 问题描述 设计复数库,实现基本的复数加减乘除运算. 输入时只需分别键入实部和虚部,以空格分割,两个复数之间用运算符分隔:输出时按a+bi的格式在屏幕上打印结果.参加样例输入和样例输出. 注意考虑特殊情况,无法计算时输出字符串"error". 样例输入 2 4 * -3 2 样例输出 -14-8i 样例输入 3 -2 + -1 3 样例输出 2+1i 2 解决方案 此题判断错误主要在除法运算上,除法运算有可能获得小数,所以在获取输入数字时,就得用

算法笔记_152: 算法提高 扶老奶奶过街(Java)

目录 1 问题描述 2 解决方案   1 问题描述 一共有5个红领巾,编号分别为A.B.C.D.E,老奶奶被他们其中一个扶过了马路. 五个红领巾各自说话: A :我和E都没有扶老奶奶 B :老奶奶是被C和E其中一个扶过大街的 C :老奶奶是被我和D其中一个扶过大街的 D :B和C都没有扶老奶奶过街 E :我没有扶老奶奶 已知五个红领巾中有且只有2个人说的是真话,请问是谁扶这老奶奶过了街? 若有多个答案,在一行中输出,编号之间用空格隔开. 例如 A B C D E(这显然不是正确答案) 2 解决方

算法笔记_161:算法提高 十进制数转八进制数(Java)

目录 1 问题描述 2 解决方案   1 问题描述 编写函数,其功能为把一个十进制数转换为其对应的八进制数.程序读入一个十进制数,调用该函数实现数制转换后,输出对应的八进制数. 样例输入 9274 样例输出 22072 样例输入 18 样例输出 22 2 解决方案 具体代码如下: import java.util.ArrayList; import java.util.Scanner; public class Main { public static void main(String[] ar

算法笔记_160:算法提高 约数个数(Java)

目录 1 问题描述 2 解决方案   1 问题描述 输入一个正整数N (1 样例输入 12 样例输出 6 样例说明 12的约数包括:1,2,3,4,6,12.共6个 2 解决方案 具体代码如下: import java.util.Scanner; public class Main { public static void main(String[] args) { int count = 0; Scanner in = new Scanner(System.in); int n = in.ne