CSDN 中国电信翼支付2014编程大赛复赛 修改数列(LIS)

题目意思:51nod1294

http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1294

给出一个整数数组A,你可以将任何一个数修改为任意一个正整数,最终使得整个数组是严格递增的且均为正整数。问最少需要修改几个数?

Input

第1行:一个数N表示序列的长度(1 <= N <= 100000)。
第2 - N + 1行:每行1个数,对应数组元素。(0 <= A[i] <= 10^9)

Output

输出最少需要修改几个数使得整个数组是严格递增的。

Input 示例

5
1
2
2
3
4

Output 示例

3

题目分析:

对于此类问题,特点在原位置的排序,我们的处理思路就是,首先每一个数减去其所在的位置,再对其进行使用LIS,但需要注意题目中要求的是正整数,所以我们必须对大于等于0的值进行LIS,修改的个数就是n-最长的LIS。

AC代码(java/c++):

C++:

#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<vector>
#include<iterator>
#define MAX 100005
using namespace std;
int a[MAX],b[MAX];
int main()
{
    int n;
    while(scanf("%d",&n)!=EOF){
        int cnt=0;
        vector<int> v;
        vector<int>::iterator it;
        for(int i=0;i<n;i++){
            scanf("%d",&a[i]);
            a[i]=a[i]-(i+1);//每一个数减去其所在位置的序号
            if(a[i]>=0) b[cnt++]=a[i];
        }
        if(cnt==0){
            cout<<n<<endl; continue;
        }
        v.push_back(b[0]);
        for(int i=1;i<cnt;i++){
            if(b[i]>=*(v.end()-1)){
                v.push_back(b[i]);
            }
            else{
                it=upper_bound(v.begin(), v.end(), b[i]);
                *(it)=b[i];
            }
        }
        //printf("%d\n",v.size());
        printf("%d\n",n-v.size());
    }
    return 0;
}

java代码:

import java.lang.reflect.Array;
import java.util.Arrays;
import java.util.Scanner;

import javax.naming.BinaryRefAddr;
import javax.xml.soap.SAAJResult;

public class XUIGAI_ARRAY {

	static int BinarySearch(int s[],int x,int low,int high)
	{
		while(low<=high)
		{
			int middle=(high+low)/2;
			if(x<s[middle])high=middle-1;
			else if(x>s[middle])low=middle+1;
			else return middle;
		}
		return high+1;
	}
	public static void main(String[] args) {
		int a[]=new int[1000005];
		int b[]=new int[1000005];
		int c[]=new int[1000005];
		int n,cnt;
		Scanner sc=new Scanner(System.in);
		while(sc.hasNext()){
			n=sc.nextInt();
			cnt=0;
			for(int i=0;i<n;i++){
				a[i]=sc.nextInt();
				a[i]=a[i]-(i+1);
				if(a[i]>=0) b[cnt++]=a[i];
			}
			if(cnt==0){
				System.out.println(n);
				continue;
			}
			int len=1,pos;
			c[len-1]=b[0];
			for(int i=1;i<cnt;i++){
//				System.out.println(b[i]);
				if(b[i]>=c[len-1]){
					c[len++]=b[i];
				}
				else{

					pos=BinarySearch(c, b[i], 0, len-1);
//					System.out.println(pos);
					if(pos>=0&&pos<=len-1) for(int j=pos;j<=len;j++){
						if(c[j]>b[i]){
							pos=j; break;
						}
					}
					c[pos]=b[i];
				}
			}
			System.out.println(n-len);
		}
	}
}
时间: 2024-10-25 18:19:20

CSDN 中国电信翼支付2014编程大赛复赛 修改数列(LIS)的相关文章

中国电信翼支付2014编程大赛决赛-一种排序 个人解题过程

首先需要表明的是我在时限内想到这个解法,但是这个解法被判错,而我也想不到反例.赛后咨询举办方的时候,他们表示过几天会发测试数据给我们.所以今天就先把思路和代码先放上来,过几天收到数据再看看到底哪里错了. 如果有读者想到相应的反例,希望可以给我留言,谢谢. 题目详情(只限Java) 给定一串整数,你只能进行两种操作:任选一个整数放到这串数之前,或者这串之后.所有的整数都不相等. 问把这串整数变为由小到大的排好序最少需要的操作次数. 输入格式: 多组数据,每组数据1行,包含若干个空格分隔的非负整数,

中国电信翼支付2014编程大赛决赛之我的见解(如果有误,望指证)

如果有误,希望可以给我留言,谢谢. 题目详情(只限Java) 给定一串整数,你只能进行两种操作:任选一个整数放到这串数之前,或者这串之后.所有的整数都不相等. 问把这串整数变为由小到大的排好序最少需要的操作次数. 输入格式: 多组数据,每组数据1行,包含若干个空格分隔的非负整数,每个整数不超过2147483647. 输出格式: 每组数据输出一行包含一个整数,表示需要最少操作的次数. 答题说明 输入样例 1 2 3 1 4 2 10 2 1 输出样例: 0 1 2 算法解析: 长度即原数组的(子序

中国电信翼支付网关接口接入

最近在做中国电信的翼支付网关接口的接入,正好拿Java练练手.到目前为止,唯一不太适应的就是自己的Java积累几乎为0,什么都要重头写起,不像C#有这么多年的沉淀,可以随手拿来用.   废话先不多说.这个支付接口就和支付宝差不多,无非就是把一些必要的数据参数,POST到指定的接口地址,然后接收它返回的支付结果.接口没有什么复杂的逻辑处理,所以可以直接采用JSP+Servlet+JDBC来做简单处理.对于WEB支付请求的发起,可以从JSP把用户输入或选择的相关数据传到Servlet,然后在Serv

2014第六届华为编程大赛初赛第一轮

/*********************************************************************** 1.投票问题 输入若干候选人,以及投票,格式如下,输出(按输入候选人输入顺序)候选人以及得票,以及 无效票数. Input: addCandidate xx1 addCandidate xx2 addCandidate xx3 addCandidate xx4 addCandidate xx5 addCandidate xx6 vote xx2 vot

2014第六届华为编程大赛初赛第四轮

/*********************************************************************** 第一题 求n个整数的最大公约数 输入 第一行: n个整数 第二行:各个整数 以空格隔开 输出:公约数 例子: input: 4 10 15 20 25 output: 5 **********************************************************************/ #include <stdio.h>

第六届华为创新杯编程大赛第二轮(2014.4.29)

第一题:外星人比数的大小 来自星星的都教授除了所有感官比地球人高出七倍,始终容颜不老以外,还拥有一项在地球人看来特别神奇的能力,他会瞬间(0.00000000000000000000001s以内)按照他的规则比较地球人熟悉的两个十进制数字的大小,他比较的规则如下:1.将要比较的两个数字分别转换成二进制数字:2.计算两个二进制数字中1的个数,个数多的数字为两者中的大者:3.负数按照其绝对值进行比较:请利用地球人发明的计算机程序逼近都教授的特异功能,实现时可以有以下约束:1.输入数据为范围在-327

hdu 4542 数论 + 约数个数相关 腾讯编程马拉松复赛

题目:http://acm.hdu.edu.cn/showproblem.php?pid=4542 小明系列故事--未知剩余系 Time Limit: 500/200 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others) Total Submission(s): 889    Accepted Submission(s): 207 Problem Description "今有物不知其数,三三数之有二,五五数之有三,七七数之有

关于2014博文大赛

写了5篇文章.其中3篇初赛,其中两篇进了决赛,另外1篇忘记微博推广了,导致网友投票没有超过50.决赛的两篇文章,第一篇我准备了挺久,虽然文字性的东西较多,但是如果仔细读的话,相信对大家会有所帮助.另外一篇写的仓促,在这里感谢各位投票的网友了. 现在关注我博客的CSDN用户也超过200位了,想到这里诚惶诚恐,希望能够分享更多的干货,和大家一起进步. 喜欢夜深人静码字,码码的感觉.尤其是,身旁睡着你最亲爱的两个人. 关于2014博文大赛,布布扣,bubuko.com

【结果发布】第六届SeedCoder编程大赛初赛结果发布

微软俱乐部科技文化月seedcoder2014编程大赛已经初审完成. 评审小组选出最棒的作品进入决赛(现场答辩+陈述环节,由评委现场打分).终于排名由"初赛分数+现场答辩分"决定. 决赛答辩时间为:2014年4月20日(本周日)  晚上19:00     有讲座票派发 地点: 34号楼103教室 以下为初赛结果(依据队名排序): 算法组获奖的队伍名单 队伍 学院 年级 奖项 YOLO 计算机科学与project学院 大二 參加答辩 aaaaaa 软件学院 大三 參加答辩 mg 软件学院