zoukankan      html  css  js  c++  java
  • 九度 1557:和谐答案 (LIS 变形)

    题目描述:

    在初试即将开始的最后一段日子里,laxtc重点练习了英语阅读的第二部分,他发现了一个有意思的情况。
    这部分的试题最终的答案总是如下形式的:
    1.A;2.C;3.D;4.E;5.F。即共有六个空格,每个空格填入一个相应的字母代表这个空格他所选择的答案,且空格中的字母不存在重复。若每个空格选择的答案都是严格递增的,则laxtc认为这个答案是和谐的,如1.A;2.C;3.D;4.E;5.F;反之,若答案中存在不递增的情况,则他认为这组答案是不和谐的,如1.A;2.C;3.B;4.E;5.F;laxtc总是希望他所选择的答案是和谐的。由于laxtc的英语并不怎么好,所以他也经常会空着一些空格,如1.A2.;3.B;4.E;5.F;此时,只要排除掉空格后的剩余部分依然是递增的,那么laxtc也认为它是和谐的。
    已知共有n个空格,laxtc已经为每一个空格选择好了Ci个候选对象。laxtc想知道他最多能填写几个空格,同时保持最终答案是和谐的。

    输入:

    输入包含多组测试数据。每组测试数据由一个整数n(1 <= n <= 100000)开头,表示共有n个位置。
    接下来共有n行数字,第i行表示laxtc为第i个空格选择的候选答案(可能会有重复的答案)。由两部分组成。第一部分为一个整数t(1 <= t <= 5),表示该空格共有t个候选答案。第二部分为t个整数,代表laxtc为该空格选择的候选答案序号(由于题数过多,这里用数字代替字母,数字在int范围内)。

    输出:

    输出为一个整数,代表laxtc得到的最大和谐答案组的长度,长度即填写的空格数。

    样例输入:
    5
    5 1 2 3 4 5
    5 1 2 3 4 5
    5 1 2 3 4 5
    5 1 2 3 4 5
    5 1 2 3 4 5
    5
    4 1 2 3 4
    4 2 3 4 5
    2 2 3
    2 4 5
    1 1
    样例输出:
    5
    4

    思路

    1. 做了20分钟 把o(n*n)的DP优化到 o(n*logn) 才发现这不就是道 LIS 变形题么, 不过仍然是 WA 到死

    代码 未通过九度测试, WA 到没脾气

    #include <iostream>
    #include <stdio.h>
    #include <algorithm>
    #include <vector>
    using namespace std;
    
    int matrix[10010][10];
    int candi[10010];
    
    int dp[10010];
    
    int binary_search(int len, int x) {
        int low = 0, high = len-1;
        
        while(low <= high) {
            int mid = (low+high)>>1;
            if(dp[mid] == x) {
                return mid;
            }else if(dp[mid] > x) {
                high = mid - 1;
            }else{
                low = mid + 1;
            }
        }
        return low;
    }
    int main() {
        freopen("testcase.txt", "r", stdin);
        int n;
        while(scanf("%d", &n) != EOF) {
            for(int i = 0; i < n; i ++) {
                scanf("%d", candi+i);
                for(int j = 0; j < candi[i]; j ++) {
                    scanf("%d", &matrix[i][j]);
                }
            }
    
            // init
            
            dp[0] = matrix[0][0];
            for(int i = 1; i < candi[0]; i ++) {
                dp[0] = min(dp[0], matrix[0][i]);
            }
    
            int len = 1;
    
            for(int i = 1; i < n; i ++) {
                bool added = false;
                int lastNum = dp[len-1];
                for(int j = 0; j < candi[i]; j ++) {
    
                    if(!added) { // not added yet
                        if(matrix[i][j] > lastNum) {
                            dp[len++] = matrix[i][j];
                            lastNum = matrix[i][j];
                            added = 1;
                        }else{
                            int pos = binary_search(len, matrix[i][j]);
                            dp[pos] = matrix[i][j];
                        }
                    }else {
                        if(matrix[i][j] >= lastNum) {
                            // do nothing
                        }else{
                            int pos = binary_search(len, matrix[i][j]);
                            dp[pos] = matrix[i][j];
                        }
                    }
                }
            }
            printf("%d
    ", len);
        }
        return 0;
    }
  • 相关阅读:
    关于Service所需要知道的大部分...
    GCN
    static变量(函数)和普通变量(函数)的区别
    FastGCN论文总结及实现(Tensorflow2.0)
    求相关系数矩阵
    K-means之亚洲杯
    归一化
    多指标综合评价方法汇总
    数据挖掘
    mat函数
  • 原文地址:https://www.cnblogs.com/xinsheng/p/3606199.html
Copyright © 2011-2022 走看看