zoukankan      html  css  js  c++  java
  • HDU 1027 Ignatius and the Princess II 选择序列题解

    直接选择序列的方法解本题,可是最坏时间效率是O(n*n),故此不能达到0MS。

    使用删除优化,那么就能够达到0MS了。

    删除优化就是当须要删除数组中的元素为第一个元素的时候,那么就直接移动数组的头指针就能够了,那么时间效率就是O(1)了,而普通的删除那么时间效率是O(n),故此大大优化了程序。

    怎样直接选择第k个序列,能够參考本博客的Leetcode题解。Leetcode题有个一模一样的题目。只是没有使用删除优化。


    看见本题的讨论中基本上都是使用STL解,还有沾沾自喜的家伙,只是使用STL解决本题尽管是能够,可是那是由于本题的数据非常弱;

    由于使用STL的时间效率是O(n*m),当中n可能是1000, 而m可能是10000,故此会达到1千万的数据处理,随便添加个大数据用例就会超时。

    故此使用STL来解决本题事实上是非常次,非常0基础的解法了。


    #include <stdio.h>
    #include <vector>
    #include <string.h>
    #include <algorithm>
    #include <iostream>
    #include <string>
    #include <limits.h>
    #include <stack>
    #include <queue>
    #include <set>
    #include <map>
    using namespace std;
    
    const int MAX_N = 1001;
    int arr[MAX_N], N, M, tbl[MAX_N];
    
    void genSeqNum()
    {
    	int mth = M-1;
    	memset(tbl, 0, sizeof(int) * N);
    	tbl[N-1] = 0;
    	for (int i = N-2, d = 2; i >= 0 && mth > 0; i--, d++)
    	{
    		tbl[i] = mth % d;
    		mth /= d;
    	}
    }
    
    void eraseNth(int A[], int i)
    {
    	--N;
    	for (; i < N; i++)
    	{
    		A[i] = A[i+1];
    	}
    }
    
    void printNums()
    {
    	genSeqNum();
    	
    	int *A = arr;
    	printf("%d", A[tbl[0]]);
    	if (!tbl[0]) A++, N--;
    	else eraseNth(A, tbl[0]);	
    
    	int t = 1;//定位tbl下标
    	while (N > 0)//优化之后的算法
    	{
    		for (; N && !tbl[t]; t++)//主要优化地方
    		{
    			printf(" %d", *A);//输出为零的,不用使用删除函数
    			A++, N--;//又一次定位数列
    		}
    		if (!N) break;//已经输出完成
    
    		printf(" %d", A[tbl[t]]);//不为零的选择,使用删除函数
    		eraseNth(A, tbl[t]);
    		t++;
    	}
    	putchar('
    ');
    }
    
    int main()
    {
    	while (scanf("%d %d", &N, &M) != EOF)
    	{
    		for (int i = 0; i < N; i++)
    		{
    			arr[i] = i+1;
    		}
    		printNums();
    	}
    	return 0;
    }



  • 相关阅读:
    directives vant之Field输入限制【v-input-float】
    【vue】 typeScript OSS图片压缩处理工具类
    vue单页面加载js方法
    H5网页打开App以及App内某个页面
    适配iphoneX万能方法!!!
    固定底部button按钮,兼容各种手机、微信等【flex布局】
    天行数据小程序demo
    iview Weapp index索引器 cityjs 增加每个城市的code值
    小程序上传图片至七牛云(支持多张上传、预览、删除图片)
    (转)异步与非阻塞之间的区别(看到的最清晰的说明)
  • 原文地址:https://www.cnblogs.com/blfshiye/p/4049951.html
Copyright © 2011-2022 走看看