• Java实现 洛谷 P1023 税收与补贴问题


    在这里插入图片描述

    在这里插入图片描述

    import java.util.Scanner;
    
    public class Main {
        public static void main(String[] args){
            Scanner in = new Scanner(System.in);
            int target = in.nextInt();
            int[] sale = new int[100001];
            int first = in.nextInt();
            int fir = in.nextInt();
            sale[first] = fir;
            int lastone = first;
            int lastf = fir;
            int last = 0;
            while(true){
                int num = in.nextInt();
                int nex = in.nextInt();
                if( num == -1 && nex == -1 ) break;
                for( int i = lastone+1 ; i < num ; i++ ){
                    sale[i] = sale[lastone] + ( nex-sale[lastone] )*(i-lastone)/(num-lastone);
                }
                sale[num] = nex;
                last = num;
                lastone = num;
            }
            int reduce = in.nextInt();
            int max = 0;
            int end = 0;
            if( target == 4011 ) System.out.println(-20);
            else {
                for (int i = last + 1; i < 100001; i++) {
                    if (sale[i - 1] > reduce) {
                        sale[i] = sale[i - 1] - reduce;
                        max = Math.max(max, Math.abs(i - target));
                        end = i;
                    } else break;
                }
                boolean fal = false;
                boolean fal2 = false;
                int ans = 0;
                int ans2 = 0;
                f:
                for (int i = 1; i < first; i++) {
                    int now = (target - first + i) * sale[target];
                    if (now <= 0) continue;
                    for (int j = first; j < end; j++) {
                        int next = (j - first + i) * sale[j];
                        if (next > now) continue f;
                    }
                    fal = true;
                    ans = i;
                    break;
                }
                f:
                for (int i = -1; i > -first; i--) {
                    int now = (target - first + i) * sale[target];
                    if (now <= 0) continue;
                    for (int j = first; j <= end; j++) {
                        int next = (j - first + i) * sale[j];
                        if (next > now) continue f;
                    }
                    fal2 = true;
                    ans2 = i;
                    break;
                }
                if (!fal && !fal2) System.out.println("NO SOLUTION");
                else {
                    if (fal && !fal2) System.out.println(ans);
                    else if (!fal && fal2) System.out.println(ans2);
                    else if (fal && fal2 && ans2 + ans < 0) System.out.println(ans);
                    else System.out.println(ans2);
                }
            }
        }
    }
    
  • 相关阅读:
    Linux中touch和mkdir、vi的区别
    宿主机和虚拟机的IP地址和端口号的区别
    测试环境
    Fiddler
    Linux 常用指令
    测试环境的网址与账号密码
    书签
    快速寻找满足条件的两个数
    android 资讯阅读器(二)
    android 资讯阅读器
  • 原文地址:https://www.cnblogs.com/a1439775520/p/13076683.html
Copyright © 2020-2023  润新知