【Java/补题/牛客/ACM赛制】2022河南萌新联赛第(五)场:信息工程大学

题目链接

2022河南萌新联赛第(五)场:信息工程大学

知识一览

01 - 结构体(H题)
02 - 二分/模拟(J题)

题目列表

快输

    static class FastReader{
        BufferedReader br;
        StringTokenizer st;
        String tmp;

        public FastReader() {
            br=new BufferedReader(new InputStreamReader(System.in));
        }

        String next() {
            while(st==null||!st.hasMoreElements()) {
                try {
                    st=new StringTokenizer(br.readLine());
                }catch(IOException e) {
                    e.printStackTrace();
                }
            }
            return st.nextToken();
        }

        int nextInt() {
            return Integer.parseInt(next());
        }

        long nextLong(){return Long.parseLong(next());}

        String nextLine() {
            String str="";
            try {
                str=br.readLine();
            }catch(IOException e) {
                e.printStackTrace();
            }
            return str;
        }

        boolean hasNext(){
            if(st!=null&&st.hasMoreTokens())return true;
            try {
                tmp=br.readLine();
                st=new StringTokenizer(tmp);
            }catch(IOException e) {
                return false;
            }
            return true;
        }
    }

    static PrintWriter out=new PrintWriter(
            new BufferedWriter(new OutputStreamWriter(System.out)));
    static FastReader sc=new FastReader();

H - 小明喝奶茶(结构体)

题目描述
小明很喜欢喝奶茶,在上大学这n天里,他给自己规定了每天喝k杯奶茶的目标,学校一共有m个奶茶店,其中第i个奶茶店会在第 Li天到第Ri天开业,每天将最多卖给小明 ci杯奶茶,每杯奶茶pi元钱,因为小明太喜欢喝奶茶啦,但是他还没有多少钱,他想知道自己在每天买完k杯奶茶之后,一共n天最少需要花多少钱。
特别的,如果第i天所有奶茶店卖给小明的奶茶都不够k杯,那么他只能喝到当天他能喝到的所有奶茶。
输入描述:
第一行三个整数n,m,k分别表示小明计划喝n天奶茶,大学里一共有m家奶茶店,并且小明每天想喝k杯奶茶
下面m行每行四个正整数L,R,c,p,表示每家奶茶店的开业日期,关业日期,每天卖出的奶茶数以及奶茶价格
输出描述:
输出包含一个整数为小明每天喝k杯奶茶需要花费的最少钱数
示例1
输入
5 3 7
1 4 5 3
1 3 5 2
2 5 10 1
输出
44
示例2
输入
7 5 13
2 3 10 7
3 5 10 10
1 2 10 6
4 5 10 9
3 4 10 8
输出
462
示例3
输入
4 3 100
3 3 2 5
1 1 3 2
2 4 4 4
输出
64
备注:
【数据范围与约定】
对于100%的数据,n,k≤100,000,m≤200,000,1≤Li≤Ri≤n,1≤ci,pi≤1,000,000

    public static void main(String[] args) {
        int n,m,k,ans=0;
        //小明计划喝n天奶茶,大学里一共有m家奶茶店,并且小明每天想喝k杯奶茶
        n=sc.nextInt();
        m=sc.nextInt();
        k=sc.nextInt();
        Shop[] a=new Shop[m];
        for(int i=0;i<m;i++){
            a[i]=new Shop(sc.nextInt(),sc.nextInt(),sc.nextInt(),sc.nextInt());
        }
        Arrays.sort(a);
        int cnt,sum;
        for(int i=1;i<=n;i++) {
            sum=1;
            for(int j=0;j<m;j++) {
                cnt=1;
                if(a[j].l<=i&&a[j].r>=i){//在开业;
                    for(;cnt<=a[j].c&&sum<=k;) {
                        ans=ans+a[j].p;
                        cnt++;
                        sum++;
                    }
                }
            }
        }
        out.println(ans);
        out.flush();
    }
}

class Shop implements Comparable<Shop>{
    //四个正整数L,R,c,p,表示每家奶茶店的开业日期,关业日期,每天卖出的奶茶数以及奶茶价格
    int l,r,c,p;

    Shop(int l,int r,int c,int p){
        this.l=l;this.r=r;this.c=c;this.p=p;
    }
    @Override
    public int compareTo(Shop o) {
        return p-o.p;
    }
}

J - AC自动机(二分+模拟)

题目描述
Zyq发明了一个新算法帮助他刷题,由于代码在刷题时的良好表现,Zyq给他取名为AC自动机。
AC自动机刷题的方式非常简单:首先会瞬间得出题目的正确做法,然后开始写程序。每秒,AC自动机的代码生成模块会有两种可能的结果:
①写了x行代码;
②心情不好,删掉了之前写的y行代码。如果y大于当前代码长度,则相当于全部删除。
对于一个题库,存在某个固定的长度n,一旦AC自动机在某秒结束时积累了大于等于n行的代码,它就会自动提交并AC此题,然后新建一个文件(即弃置之前的所有代码)并开始写下一题。Zyq在某个 OJ 上跑了一天的AC自动机,得到了很多条关于写代码的日志信息。他突然发现自己没有记录这个题库的n究竟是多少。所幸他通过自己在题库上的Rank知道了AC自动机一共AC了k道题,希望你计算n可能的最小值和最大值。
输入描述:
第一行两个整数L,k,表示刷题机的日志一共有l行,一共了切了k题。
第二行L个整数x1,x2,x3……xL。xi>0表示写了xi行代码,xi<0表示删除了这道题的xi行代码。
输出描述:
输出两个数a,b分别代表n可能的最小值和最大值。如果不存在这样的n则输出-1。
示例1
输入
4 2
2
5
-3
9
输出
3 7
备注:
【数据范围与约定】
对于100%的数据,L≤100000,k≤10000,-10^9 ≤xi≤ 10^9

	static int a[];
    //刷题机的日志一共有l行,一共了切了k题
    static int L,k;
    static long min,max;
    public static void main(String[] args) {
        L=sc.nextInt();
        k=sc.nextInt();
        a=new int[L+1];
        for(int i=1;i<=L;i++)a[i]=sc.nextInt();

        long l=1,r=(long)1e18;
        while(l<r){
            long mid=(l+r)>>1;
            if(check(mid)>k) l=mid+1;
            else r=mid;
        }
        min=l;
        l=1;r=(long)1e18;
        while(l<r){
            long mid=(l+r>>1)+1;
            if(check(mid)<k)
                r=mid-1;
            else
                l=mid;
        }
        max=r;
        if(check(min)!=k||check(max)!=k) out.println(-1);
        else out.println(min+" "+max);
        out.flush();
    }

    private static long check(long mid){
        long cur=0,cnt=0;
        for(int i=1;i<=L;i++){
            cur+=a[i];
            if(cur<=0) cur=0;
            else if(cur>=mid) {
                cur=0;cnt++;
            }
        }
        return cnt;
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值