日本搞逼视频_黄色一级片免费在线观看_色99久久_性明星video另类hd_欧美77_综合在线视频

國內最全IT社區平臺 聯系我們 | 收藏本站
阿里云優惠2
您當前位置:首頁 > php開源 > php教程 > 翼支付編程大賽――修改數列

翼支付編程大賽――修改數列

來源:程序員人生   發布時間:2014-12-18 09:02:19 閱讀次數:3118次

題目詳情(修改數列):

我們有1個數列。我們可以把其中的任意1些項替換成其他的正整數,但是我們不能刪掉項,也不能交換項的順序。請問最少需要幾次替換,才能把數列變成嚴格單調遞增的?

輸入格式

多組數據,每組數據第1行1個正整數n (n<=1000000)

每組數據第2行是n個空格分隔的非負整數,每一個不超過10^9,表示數列中的數。

輸出格式

對每組數據,輸出1行,包括其最少的替換次數。

答題說明:

輸入樣例  

3

4 10 20

5

1 7 2 20 22

輸出樣例

0

1

先說下思想:鑒戒最長遞增子序列(LIS)的思想,添加限制條件:元素值>=元素下標;元素之間的差值>=元素下標之間的差值。
舉例:A[0...8] = {2, 1, 5, 3, 6, 4, 8, 9, 7}
設置兩個數組:B記錄最長遞增子串(符合本題題意的條件下的),Pos記錄子串中各元素在原數組中的下標。設置變量:len記錄子串長度。
(1)從后往前找數組A,第1個滿足:元素值>=下標的元素。應當為9,所以有B[0]=9, Pos[0]=7,len=1;
(2)再看9之前的元素8,先判斷它是不是>=下標,可知成立。再判斷(B[len⑴]-A[6] = 9⑻) >= (1=Pos[len⑴]⑹),成立,因此子串中加入元素8。那末B[0,1] = {9,8}, Pos[0,1] = {7,6}, len=2;
(3)再看8之前的元素4,由于它<下標,因此直接跳過;
(4)再看4之前的元素6,它>=下標,(B[len⑴]-A[4] = 8⑹) >= (2 = Pos[len⑴] - 4),因此子串加入元素6,那末B[0,1,2] = {9,8,6},Pos[0,1,2]={7,6,4}, len = 3;
(5)再看6之前的元素3,>=下標,6⑶>=1,那末B[0,1,2,3]={9,8,6,3},Pos[0,1,2,3]={7,6,4,3},len=4;
(6)再看3之前的5,>=下標,不符合3⑸>=1,由于5>3,得看是不是要取代B中已有的元素。在B中從后往前找到,恰好大于5的數,那就是6。接下來就要判斷是不是應當讓5來取代6后面的元素3的位置。由于6⑸=1>=(2=Pos[2]⑵)不成立,因此不能讓5來替換,所以還是跳過;
(7)再看5之前的1,均符合要求,因而B[0,1,2,3,4]={9,8,6,3,1},Pos[0,1,2,3,4]={7,6,4,3,1},len=5;
(8)再看1之前的2,>=下標,不符合1⑵>=1,由于2>1,得看是不是要取代B中已有元素。一樣找到3,由于3⑵>=3不成立,所以跳過。
至此,得到符合要求的最長不需要改動的子串,那末元數組總長度―len就是最少需要替換的個數。
要求用java,基本輸入輸出也不會,只得求助百度了,下面是小菜雞的代碼:
<pre name="code" class="java">import java.util.Scanner;  
  
public class Main {    
    public static void main(String[] args) {  
        Scanner in = new Scanner(System.in);  
        int n;  
        int[] num;  
        while(in.hasNext()){  
            n = in.nextInt();
            num = new int[n];
            for(int i = 0; i < n; i++)
            	num[i] = in.nextInt();
            int len = 0;
            for(int i = n; i > 0; i--){//暴力破解!!
            	int tmp = lis(num, i);
            	len = tmp > len ? tmp : len;
            }
            System.out.println(n-len);
        }
    }  
  
    private static int lis(int[] num, int n) {
		// TODO Auto-generated method stub
		int[] bnum = new int[n];
		int[] bpos = new int[n];
		int init;	//從后到前,第1個元素值大于等于下標(從0開始)的元素為首
		int len;	//最長嚴格單音調串長度
		for(init = n - 1; init >= 0; init--){
			if(num[init] >= init){
				bnum[0] = num[init];
				bpos[0] = init;
				break;
			}
		}
		len = 1;
		if(init < 0){
			return 1;
		}
		for(int i = init - 1; i >= 0; i--){
			if(num[i] >= i){	//值大于等于下標才有比較的意義
				if(bnum[len - 1] - num[i] >= bpos[len - 1] - i){    
				//值的差大于等于下標的差才可以添加
					bnum[len] = num[i];
					bpos[len++] = i;
				}else if(num[i] > bnum[len - 1]){
					int pos = find(bnum, bpos, len, num[i], i);	
					//尋覓替換位置
					if(pos != ⑴){
						bnum[pos] = num[i];
						bpos[pos] = i;
					}
				}
			}
		}
		return len;
	}

	private static int find(int[] bnum, int[] bpos, int len, int number, int pos) {
		// TODO Auto-generated method stub
		int i = 0;
		for(i = len - 1; i > 0; i--){	//找到恰好比number大的元素位置
			if(bnum[i - 1] > number){
				break;
			}
		}
		if(i <= 0)
			return 0;
		else{
			if(bnum[i - 1] - number >= bpos[i - 1] - pos)	//判斷替換可行否
				return i;
			else
				return ⑴;
		}
	}
}



本地測試的結果都是正確的,但是提交了是毛病,實在不知道哪里的問題。。。
4
5 4 3 2
3


6
5 6 3 7 4 8
4


6
5 6 4 7 3 8
4


6
5 6 3 4 7 8
2


6
5 6 4 3 7 8
3


6
1 2 3 4 5 6
0


5
1 3 3 2 4
3


簡單修改下,增加了個暴力破解的for循環,目前這些測試用例是可以的,但是提交后還是毛病。。。

任務還是很艱巨。。。


生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關閉
程序員人生
主站蜘蛛池模板: 欧美xxxx视频 | 亚洲福利视频在线 | 欧美日韩黄色 | 亚洲国产成人精品女人久久久 | 免费麻豆 | 亚洲精品乱码久久久久久蜜糖图片 | 亚洲精品一区二区三区不 | 91国产精品 | 亚洲在线成人 | 久久久久成人网 | 亚洲国产精品一区二区第一页 | 国产在线污| 成人欧美一区二区三区在线播放 | 在线免费看污 | 玖玖在线精品 | 精品国产一区二区三区麻豆小说 | 欧美一二| 亚洲一区二区成人 | 中国一级片在线 | 成人毛片网站 | 嫩草天堂 | 亚洲最大成人免费视频 | 天堂蜜桃一区二区三区 | 国产视频一区二区在线观看 | 99爱精品视频 | 91精品国产综合久久香蕉最新版 | 伦乱视频| 国产福利一区二区三区 | 欧美视频亚洲视频 | 精品一区二区国产 | 一区二区蜜桃 | 欧美日韩在线一区二区 | 99精品视频在线免费观看 | 可以免费看的av | 国产激情第一页 | 玖玖精品 | 国产高清一区二区 | 亚洲一区二区三区四区五区午夜 | 久久综合九色综合网站 | 黄色一级毛片 | 国产精品视频网 |