列表

详情


NC238088. 牛牛的说谎机器

描述

牛牛在和它的机器玩猜数字,可是机器好像坏了……
具体来说,机器首先会随机生成一个 的数字 k,紧接着机器会给牛牛 m 条指令,指令的格式有如下三种:
1、op x y;这里, 代表有 
2、op x;这里, 代表有 
3、op x;这里, 代表有 
牛牛知道这台机器已经学会了说谎,所以它所描述的指令可能都是错误的,现在牛牛想知道机器错误的程度以便来制定修理它的方案。
所以牛牛想请你告诉它,当 k 这个范围内的值时,机器最多有多少条指令是错误的,而 k 又有多少种取值方式使得机器的错误指令数最多。

输入描述

第一行两个整数代表 n,m 
接下来 m 行每行一条指令,指令格式见题面。
保证:

输出描述

输出共一行两个整数,分别代表机器最多的错误指令数,以及有多少种 k 的取值会使得机器的错误指令数最多。

示例1

输入:

9 5
1 3 6
2 7
1 2 3
3 2
1 5 8

输出:

4 3

说明:

最多的错误指令数为 4。
使得错误指令数最多的取值有 3 种,分别是:
  取值为 1,此时第 1、2、3、5 条指令是错误的。
  取值为 4,此时第 2、3、4、5 条指令是错误的。
  取值为 9,此时第 1、3、4、5 条指令是错误的。

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

Python3 解法, 执行用时: 1091ms, 内存消耗: 52100K, 提交时间: 2023-08-11 14:52:51

import sys
input=sys.stdin.readline 
n,m=map(int,input().split())

diff=[0]*(n+2)
for i in range(m):
    arr = [int(k) for k in input().split()]
    if len(arr)==3:
        l,r=arr[1:]
    elif arr[0]==2:
        l,r=arr[1],n 
    else:
        l,r=1,arr[1]
    diff[l]+=1
    diff[r+1]-=1
for i in range(1,n+1):
    diff[i]+=diff[i-1]
maxnum=min(diff[1:n+1])    
maxcount=diff[1:n+1].count(maxnum)

print(m-maxnum,maxcount)

Java 解法, 执行用时: 1059ms, 内存消耗: 26032K, 提交时间: 2023-08-11 14:51:47

import java.util.Scanner;
import static java.lang.System.*;

public class Main{
    public static void main(String[] args){
        Scanner In=new Scanner(in);
        int n=In.nextInt(),m=In.nextInt(),o,x,y;
        int[] pre=new int[(int)1e6+7];
        for(int i=0;i<m;++i){
            o=In.nextInt();
            x=In.nextInt();
            if(o==1){
                y=In.nextInt();
                pre[x]+=1;
                pre[y+1]-=1;
            }
            else if(o==2){
                pre[x]+=1;
            }
            else {
                pre[1]+=1;
                pre[x+1]-=1;
            }
        }
        int ma=-0x3f3f3f3f,sum=0;
        for(int i=1;i<=n;++i){
            pre[i]+=pre[i-1];
            ma=Math.max(ma,m-pre[i]);
        }
        for(int i=1;i<=n;++i){
            if(ma==m-pre[i])++sum;
        }
        out.print(ma+" "+sum);
    }
}

上一题