当前位置: 代码迷 >> 综合 >> 【模拟与高精度】【JAVA】P1328 [NOIP2014 提高组] 生活大爆炸版石头剪刀布
  详细解决方案

【模拟与高精度】【JAVA】P1328 [NOIP2014 提高组] 生活大爆炸版石头剪刀布

热度:52   发布时间:2023-12-01 15:06:59.0

在这里插入图片描述
题意:
就像题目所言,就是加入另外两种手势,根据手势的出两个小朋友的赢的次数
思路:

首先我想到用多个条件判断来实现,但这未必有些繁琐,可以简化一点的就是可以通过打表的方式,这样会减少许多程序中的判断,更加快速易懂。

打表的话,我们首先要得到胜负表,通过题上给出的甲对乙的胜负表,加以转换就得到全部的胜负表(因为胜负有三种情况,胜、平、输,根据这点我们可以知道一个玩家的胜负即可反推出另一个玩家的胜负,打表中用1代表胜利,0代表输或者平),这样通过if判断当前玩家a对玩家b的结果便可以进行结果统计,循环中的玩家出拳周期通过求余数解决。

package LOQ.模拟与高精度;import java.util.Scanner;public class P1328 {
    public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);int n=sc.nextInt(),a=sc.nextInt(),b=sc.nextInt();//整型数组存放a和b的出拳int[] aArray = new int[a];int[] bArray = new int[b];for(int i=0;i<a;i++) {
    aArray[i]=sc.nextInt();}for(int i=0;i<b;i++) {
    bArray[i]=sc.nextInt();}//结果集int[][] res={
    {
    0,0,1,1,0},{
    1,0,0,1,0},{
    0,1,0,0,1},{
    0,0,1,0,1},{
    1,1,0,0,0}};int ares=0,bres=0;for(int i=0;i<n;i++) {
    if(res[aArray[i%a]][bArray[i%b]]==1) {
    ares++;} else if(res[aArray[i%a]][bArray[i%b]]==0 && aArray[i%a]!=bArray[i%b]) {
    //当a和b结果相同,也就是平局时的结果需要被筛选出去bres++;}}System.out.println(ares+" "+bres);}
}
  相关解决方案