Codeforces Round #737 (Div. 2)

Codeforces Round #737 (Div. 2)

原题地址

#题目分数是否AC
AEzzat and Two Subsequences800
BMoamen and k-subarrays1100
CMoamen and XOR1700
DEzzat and Grid2200
EAssiut Chess2800





A. Ezzat and Two Subsequences

题目类型  思维

题意

   给定一个数组,将数组分为两个部分,就可以得到两部分平均数和的最大值。


分析

   因为一个集合的平均数 v v v 一定满足 m i n ≤ v ≤ m a x min \leq v \leq max minvmax。所以将数组分为其最大值一部分和其它值一部分所得的结果是最大的。


时间复杂度

   O ( n ) O(n) O(n)


代码
public static void solve() throws IOException {
    int n = nextInt();

    int[] a = new int[n];

    long sum = 0;
    for (int i = 0; i < n; i++) {
        a[i] = nextInt();
        sum += a[i];
    }

    long Max = Long.MIN_VALUE;
    for (int i = 0; i < n; i++) Max = Math.max(Max, a[i]);

    double ans = Max + (double) (sum - Max) / (n - 1);

    pw.println(String.format("%.10f", ans));
}






B. Moamen and k-subarrays

题目类型   思维 排序

题意

   输入一个数组,判断能否将数组恰好分为 k k k 个子数组(连续的部分),并将这 k k k 个子数组进行重排使源数组变为升序。


分析

    如果源数组中一个连续的部分和源数组升序排序后的状态是相同的,则这个部分可以分成一个子数组。按照这个方式对源数组进行划分,统计划分出子数组的个数 c n t cnt cnt, 这个数是划分的最少个数,如果 k < c n t k < cnt k<cnt 则不能重排使其变为升序,否则一定可以。


时间复杂度

   O ( n log ⁡ n ) O(n\log n) O(nlogn)


代码
    public static void solve() throws IOException {
        int n = nextInt();
        int k = nextInt();
 
        int[] a = new int[n];
        int[] b = new int[n];
 
        for (int i = 0; i < n; i++) a[i] = nextInt();
        System.arraycopy(a, 0, b, 0, n);
 
        shuffle(b);
        Arrays.sort(b);
 
        int cnt = 0;
        for (int i = 0; i < n; i++) {
            int j = binarySearch(b, 0, n - 1, a[i]);
            while (i < n && j < n && a[i] == b[j]) {
                i++;
                j++;
            }
            i--;
            cnt++;
        }
 
        if (cnt <= k) pw.println("YES");
        else pw.println("NO");
    }
 
    public static void shuffle(int[] a) {
        for (int i = 0; i < a.length; i++) {
            int rand = (int) (Math.random() * a.length);
            int temp = a[rand];
            a[rand] = a[i];
            a[i] = temp;
        }
    }
 
    public static int binarySearch(int[] a, int l, int r, int aim) {
        while (l < r) {
            int mid = l + r >> 1;
            if (a[mid] >= aim) r = mid;
            else l = mid + 1;
        }
 
        return r;
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值