Acwing第99周,周赛

四则运算(简单)

给定三个整数 a,b,c,请你计算并输出 (axb)/b+c 的值。

输入格式

共一行,包含三个整数 a,b,c。

输出格式

一个实数,表示结果。

结果保留四位小数。

数据范围

所有测试点满足 1≤a,b,c≤1000。

输入样例1:

100 50 50

 输出样例1:

50.0000

 输入样例2:

199 60 40

 输出样例2:

119.4000

 

import java.util.Scanner;

public class Main{
    public static void main(String[] args) {
        Scanner in=new Scanner(System.in);
        int a=in.nextInt();
        int b=in.nextInt();
        int c=in.nextInt();
        double res=(a*b)*1.0/(b+c);
        System.out.println(String.format("%.4f",res));
    }
}

总结

非常基础,不会的小伙伴要反思了。打卡题

整理账本(中等)

 

账本中记录了一种产品的 n 条买卖记录。

记录分为两种,格式如下:

  • B p q,表示以 p 元/件的价格,买入 q 件该种商品。
  • S p q,表示以 p 元/件的价格,卖出 q 件该种商品。

任何卖出记录的交易价格都高于任何买入记录的交易价格。

也就是说,不会存在卖出记录和买入记录的交易价格相同的情况。

现在,请你对账本进行整理,对所有交易价格相同的记录进行合并,使得每个交易价格只存在一条记录,新记录的交易数量等于所有参与合并的旧记录的交易数量之和。

具体来说,如果账本中有 k条记录的交易价格为 p,它们的交易数量分别为 q1,q2,…,qk,则将它们合并为一条新记录,新记录的交易价格仍为 p,交易数量为 q1+q2+…+qk。

注意:

  • 合并为新记录后,参与合并的旧记录就从帐本中抹除了。
  • 新纪录的交易类型(买入或卖出)保持不变,即与参与合并的旧记录保持一致。
  • 不会存在卖出记录和买入记录的交易价格相同的情况。

整理完毕后,对于现有的所有记录,请你找到其中交易价格最低的 s 条卖出记录和交易价格最高的 s条买入记录。

输入格式

第一行包含两个正整数 n,s。

接下来 n 行,每行包含一个记录,格式如题目描述。

输出格式

首先,按照交易价格从高到低的顺序,输出交易价格最低的 s 条卖出记录,每行一条,格式与输入相同。如果不足 s 条,则有多少输出多少。

然后,按照交易价格从高到低的顺序,输出交易价格最高的 s 条买入记录,每行一条,格式与输入相同。如果不足 s 条,则有多少输出多少。

数据范围

前 44 个测试点满足 1≤n≤6。
所有测试点满足 1≤n≤1000,1≤s≤50,0≤p≤10e5,1≤q≤10e4。

输入样例:

6 2
B 10 3
S 50 2
S 40 1
S 50 6
B 20 4
B 25 10

 输出样例:

S 50 8
S 40 1
B 25 10
B 20 4

import java.util.Iterator;
import java.util.Scanner;
import java.util.TreeSet;

public class test02 {
    public static void main(String[] args) {
        Scanner in=new Scanner(System.in);
        long[] B=new long[100000+100];
        long[] S=new long[100000+100];
        TreeSet<Integer> sB=new TreeSet<>();
        TreeSet<Integer> sS=new TreeSet<>();
        int n=in.nextInt();
        int s=in.nextInt();
        String temp=in.next();
        boolean one=true;
        for(int i=0;i<n;i++){
            String str=in.nextLine();
            if(one){
                str=temp+str;
                one=false;
            }
            String[] strings = str.split(" ");
            if(strings[0].equals("B")){
                B[Integer.parseInt(strings[1])]+=Integer.parseInt(strings[2]);
                sB.add(Integer.parseInt(strings[1]));
            }else{
                S[Integer.parseInt(strings[1])]+=Integer.parseInt(strings[2]);
                sS.add(Integer.parseInt(strings[1]));
            }
        }
        int count=s-1;
        int[] arr2=new int[s];
        Iterator<Integer> iterator1 = sS.iterator();
        while (iterator1.hasNext()) {
            Integer next = iterator1.next();
            arr2[count--]=next;
            if(count==-1){
                break;
            }
        }
        count=0;
        for (int i=0;i<arr2.length;i++){
            if(arr2[i]==0){
                if(count==s-1){
                    break;
                }
                continue;
            }
            System.out.println("S "+arr2[i]+" "+S[arr2[i]]);
        }
        int[] arr1=new int[sB.size()];
        Iterator<Integer> iterator = sB.iterator();
        count=0;
        while (iterator.hasNext()) {
            Integer next = iterator.next();
            arr1[count++]=next;
        }
        for (int i=sB.size()-1;i>sB.size()-s-1;i--){
            if(i==-1||(arr1[i]==0&&B[arr1[i]]==0)){
                break;
            }
            System.out.println("B "+arr1[i]+" "+B[arr1[i]]);
        }
    }
}

 总结

nextInt两次转nextline(next)都会有读取问题,c/c++应该不会,我将第一次的第一个字符保存下来,然后拼接,第2-n次都不会有该问题.将数据用TreeSet(TreeMap)保存,利用特性排序,后对数据进行处理,相当于模拟题吧

 扩展区间(困难)

给定 n 个区间,编号 1∼n。

其中,第 i个区间为 [xi,xi]。

初始时,任意两个区间的交集为空。

对于每个区间,你都可以选择一个方向(向左或向右)对其进行扩展,当然也可以选择不对其进行扩展。每个区间最多只能扩展一次。

第 i 个区间的固定扩展长度为 li。

具体来说,对于第 i个区间,你有三个选择:

  • 如果你选择使其向左扩展,那么它变为 [xi−li,xi]。
  • 如果你选择使其向右扩展,那么它变为 [xi,xi+li]。
  • 如果你选择不对其进行扩展,那么它仍保持 [xi,xi] 不变。

我们希望尽可能多的区间能够得到扩展,但是必须保证所有扩展结束后,任意两个区间的交集为空仍然成立。

请问,最多可以扩展多少个区间?

输入格式

第一行包含整数 n。

接下来 n 行,每行包含两个整数 xi,li。

所有区间按照 xi 从小到大的顺序给出。

输出格式

一个整数,表示可以扩展的最大区间数量。

数据范围

前 6 个测试点满足 1≤n≤5。
所有测试点满足 1≤n≤10e5,1≤x1<x2<…<xn≤10e9,1≤li≤10e9。

输入样例1:

5
1 2
2 1
5 10
10 9
19 1

输出样例1: 

3

 输入样例2:

5
1 2
2 1
5 10
10 9
20 1

 输出样例2:

4

import java.util.Scanner;

public class Main{
    static int n;
    static long[][] arr;
    static long max=-1;
    public static void main(String[] args) {
        Scanner in=new Scanner(System.in);
        n=in.nextInt();
        if(n==1){
            System.out.println(1);
            return;
        }
        arr=new long[n][2];
        for(int i=0;i<n;i++){
            arr[i][0]=in.nextLong();
            arr[i][1]=in.nextLong();
        }
        bfs(0,0);

        System.out.println(max);
    }
    static void bfs(long ans,int count){
        if(count==n){
            max=Math.max(max,ans);
            return;
        }
        if(count==0){
            bfs(ans+1,count+1);
        }
        if(count!=0&&arr[count][0]-arr[count][1]>arr[count-1][0]){
            bfs(ans+1,count+1);
        }
        bfs(ans,count+1);
        if(count==n-1)
        {
            bfs(ans+1,count+1);
        }
        if(count!=n-1&&arr[count][0]+arr[count][1]<arr[count+1][0]){
            bfs(ans+1,count+1);
        }
    }
}

 总结

不能全部对,只能过13/22,应该是递归没有考虑第i(i>2)时,[x(i-1),x(i-1)+li(i-1)]与[x(i),x(i)+li(x)]会有重合,但用Set会爆,过5/22个吧。欢迎大佬补充这题

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值