• Div 595 C1 C2


    Good Numbers (easy version)

    数据范围比较小 ,可以子集枚举 3 的幂,打表,然后lower_bound()输出, (O(n log n))

    #include <bits/stdc++.h>
    using namespace std;
    int powi[20],a[1000];
    int go[1051]={
    	0,1,3,4,9,10,12,13,27,28,30,31,36,37,39,40,81,82,84,85,90,91,93,94,108,
    	109,111,112,117,118,120,121,243,244,246,247,252,253,255,256,270,271,273,
    	274,279,280,282,283,324,325,327,328,333,334,336,337,351,352,354,355,360,
    	361,363,364,729,730,732,733,738,739,741,742,756,757,759,760,765,766,768,
    	769,810,811,813,814,819,820,822,823,837,838,840,841,846,847,849,850,972,
    	973,975,976,981,982,984,985,999,1000,1002,1003,1008,1009,1011,1012,1053,
    	1054,1056,1057,1062,1063,1065,1066,1080,1081,1083,1084,1089,1090,1092,1093,
    	2187,2188,2190,2191,2196,2197,2199,2200,2214,2215,2217,2218,2223,2224,2226,
    	2227,2268,2269,2271,2272,2277,2278,2280,2281,2295,2296,2298,2299,2304,2305,
    	2307,2308,2430,2431,2433,2434,2439,2440,2442,2443,2457,2458,2460,2461,2466,
    	2467,2469,2470,2511,2512,2514,2515,2520,2521,2523,2524,2538,2539,2541,2542,
    	2547,2548,2550,2551,2916,2917,2919,2920,2925,2926,2928,2929,2943,2944,2946,
    	2947,2952,2953,2955,2956,2997,2998,3000,3001,3006,3007,3009,3010,3024,3025,
    	3027,3028,3033,3034,3036,3037,3159,3160,3162,3163,3168,3169,3171,3172,3186,
    	3187,3189,3190,3195,3196,3198,3199,3240,3241,3243,3244,3249,3250,3252,3253,
    	3267,3268,3270,3271,3276,3277,3279,3280,6561,6562,6564,6565,6570,6571,6573,
    	6574,6588,6589,6591,6592,6597,6598,6600,6601,6642,6643,6645,6646,6651,6652,
    	6654,6655,6669,6670,6672,6673,6678,6679,6681,6682,6804,6805,6807,6808,6813,
    	6814,6816,6817,6831,6832,6834,6835,6840,6841,6843,6844,6885,6886,6888,6889,
    	6894,6895,6897,6898,6912,6913,6915,6916,6921,6922,6924,6925,7290,7291,7293,
    	7294,7299,7300,7302,7303,7317,7318,7320,7321,7326,7327,7329,7330,7371,7372,
    	7374,7375,7380,7381,7383,7384,7398,7399,7401,7402,7407,7408,7410,7411,7533,
    	7534,7536,7537,7542,7543,7545,7546,7560,7561,7563,7564,7569,7570,7572,7573,
    	7614,7615,7617,7618,7623,7624,7626,7627,7641,7642,7644,7645,7650,7651,7653,
    	7654,8748,8749,8751,8752,8757,8758,8760,8761,8775,8776,8778,8779,8784,8785,
    	8787,8788,8829,8830,8832,8833,8838,8839,8841,8842,8856,8857,8859,8860,8865,
    	8866,8868,8869,8991,8992,8994,8995,9000,9001,9003,9004,9018,9019,9021,9022,
    	9027,9028,9030,9031,9072,9073,9075,9076,9081,9082,9084,9085,9099,9100,9102,
    	9103,9108,9109,9111,9112,9477,9478,9480,9481,9486,9487,9489,9490,9504,9505,
    	9507,9508,9513,9514,9516,9517,9558,9559,9561,9562,9567,9568,9570,9571,9585,
    	9586,9588,9589,9594,9595,9597,9598,9720,9721,9723,9724,9729,9730,9732,9733,
    	9747,9748,9750,9751,9756,9757,9759,9760,9801,9802,9804,9805,9810,9811,9813,
    	9814,9828,9829,9831,9832,9837,9838,9840,9841,19683,19684,19686,19687,19692,
    	19693,19695,19696,19710,19711,19713,19714,19719,19720,19722,19723,19764,19765,
    	19767,19768,19773,19774,19776,19777,19791,19792,19794,19795,19800,19801,19803,
    	19804,19925,19926,19927,19928,19929,19930,19935,19936,19938,19939,19953,19954,
    	19956,19957,19962,19963,19965,19966,20007,20008,20010,20011,20016,20017,20019,
    	20020,20034,20035,20037,20038,20043,20044,20045,20046,20047,20412,20413,20415,
    	20416,20421,20422,20424,20425,20439,20440,20442,20443,20448,20449,20451,20452,
    	20493,20494,20496,20497,20502,20503,20505,20506,20520,20521,20523,20524,20529,
    	20530,20532,20533,20655,20656,20658,20659,20664,20665,20667,20668,20682,20683,
    	20685,20686,20691,20692,20694,20695,20736,20737,20739,20740,20745,20746,20748,
    	20749,20763,20764,20766,20767,20772,20773,20775,20776,21870,21871,21873,21874,
    	21879,21880,21882,21883,21897,21898,21900,21901,21906,21907,21909,21910,21951,
    	21952,21954,21955,21960,21961,21963,21964,21978,21979,21981,21982,21987,21988,
    	21990,21991,22113,22114,22116,22117,22122,22123,22125,22126,22140,22141,22143,
    	22144,22149,22150,22152,22153,22194,22195,22197,22198,22203,22204,22206,22207,
    	22221,22222,22224,22225,22230,22231,22233,22234,22599,22600,22602,22603,22608,
    	22609,22611,22612,22626,22627,22629,22630,22635,22636,22638,22639,22680,22681,
    	22683,22684,22689,22690,22692,22693,22707,22708,22710,22711,22716,22717,22719,
    	22720,22842,22843,22845,22846,22851,22852,22854,22855,22869,22870,22872,22873,
    	22878,22879,22881,22882,22923,22924,22926,22927,22932,22933,22935,22936,22950,
    	22951,22953,22954,22959,22960,22962,22963,26244,26245,26247,26248,26253,26254,
    	26256,26257,26271,26272,26274,26275,26280,26281,26283,26284,26325,26326,26328,
    	26329,26334,26335,26337,26338,26352,26353,26355,26356,26361,26362,26364,26365,
    	26487,26488,26490,26491,26496,26497,26499,26500,26514,26515,26517,26518,26523,
    	26524,26526,26527,26568,26569,26571,26572,26577,26578,26580,26581,26595,26596,
    	26598,26599,26604,26605,26607,26608,26973,26974,26976,26977,26982,26983,26985,
    	26986,27000,27001,27003,27004,27009,27010,27012,27013,27054,27055,27057,27058,
    	27063,27064,27066,27067,27081,27082,27084,27085,27090,27091,27093,27094,27216,
    	27217,27219,27220,27225,27226,27228,27229,27243,27244,27246,27247,27252,27253,
    	27255,27256,27297,27298,27300,27301,27306,27307,27309,27310,27324,27325,27327,
    	27328,27333,27334,27336,27337,28431,28432,28434,28435,28440,28441,28443,28444,
    	28458,28459,28461,28462,28467,28468,28470,28471,28512,28513,28515,28516,28521,
    	28522,28524,28525,28539,28540,28542,28543,28548,28549,28551,28552,28674,28675,
    	28677,28678,28683,28684,28686,28687,28701,28702,28704,28705,28710,28711,28713,
    	28714,28755,28756,28758,28759,28764,28765,28767,28768,28782,28783,28785,28786,
    	28791,28792,28794,28795,29160,29161,29163,29164,29169,29170,29172,29173,29187,
    	29188,29190,29191,29196,29197,29199,29200,29241,29242,29244,29245,29250,29251,
    	29253,29254,29268,29269,29271,29272,29277,29278,29280,29281,29403,29404,29406,
    	29407,29412,29413,29415,29416,29430,29431,29433,29434,29439,29440,29442,29443,
    	29485,29487,29488,29494,29496,29497,29511,29512,29514,29515,29520,29521,29523,
    	29524,70308,70510,70797,70862,71116,71351,71439,71466,71532,71555,71583,71608,
    	71639,71660,71692,71711,72400,72655,72705,4214341,4218416,6690937,8029282,33576385};
    int main(){
        // 注释掉的 是子集枚举 3 的幂
    	// freopen("out.txt","w",stdout);
    	// int k = 0;
    	// powi[0] = 1;
    	// for(int i = 1;i < 10; ++i){ // 3^9 == 19683
    	// 	powi[i] = powi[i-1]*3;
    	// }
    	// for(int i = 0;i < (2<<10); ++i){
    	// 	for(int j = 0;j < 10; ++j){
    	// 		if(i&(1<<j)){
    	// 			a[k] += powi[j];
    	// 		}
    	// 	}
    	// 	k++;
    	// }
    	// sort(a,a+k);
    	// k = unique(a,a+k) - a;
    	// for(int i = 0;i < k; ++i){
    	// 	cout << a[i]<<",";
    	// }
    	// cout << endl << k << endl;
    	int q,x;
    	cin >> q;
    	while(q--){
    		cin >> x;
    		cout << go[lower_bound(go,go+1051,x)-go] << endl;
    	}
    	return 0;
    }
    
    

    正解

    题目要求 3的幂不能重复,因此在 3进制下,每个数字的 基数只能是 0 或者 1,不能是 2

    可以用 十进制 转 n进制的方法, %n 取余,只需要判断即可,不用关心倒序输出。

    从 n 开始向上找寻,第一个good 数,输出即可

    #include <bits/stdc++.h>
    using namespace std;
    int main(){
    	int q,n;
    	cin >> q;
    	while(q--){
    		cin >> n;
    		while(1){
    			bool ok = 1;
    			int cur = n;
    			while(cur > 0){
    				if(ok && cur%3 == 2) ok = 0;
    				cur /= 3;
    			}
    			if(ok) break;
    			n++;
    		}
    		cout << n <<endl;
    	}
    	return 0;
    }
    

    Good Numbers (hard version)

    数据范围变大之后,可以考虑一般性

    在3进制下,找到最大的基数 2 ,然后再从 2 到 end() 找到第一个为 0 的缺口

    (可能存在 2 之后全是 1 的情况,所以要 在最后,手动push(1)

    把 这个 0 变成 1,他的左边所有数字全变成 0 ,就可以保证,他为目标答案。

    (在二进制下想一想吧,$2^0 + 21+22+2^3 < 2^4 $

    image-20191026171536298.png

    #include <bits/stdc++.h>
    using namespace std;
    typedef long long LL;
    int main(){
    	int q;
    	LL n;
    	cin >> q;
    	while(q--){
    		cin >> n;
    		LL ans = 0,pw = 1;
    		vector<int> val;
    		int pos2 = -1;
    		while(n > 0){
    			val.push_back(n % 3);
    			if(val.back() == 2) pos2 = int(val.size()) - 1;
    			n /= 3;
    		}
    		val.push_back(0);
    		if(pos2 != -1){
    			int pos0 = find(val.begin() + pos2,val.end(),0) - val.begin();
    			val[pos0] = 1;
    			for(int i = pos0 - 1;i >= 0; --i){
    				val[i] = 0;
    			}
    		}
    		for(int i = 0;i < int(val.size()); ++i){
    			ans += pw*val[i];
    			pw *= 3;
    		}
    		cout << ans << endl;
    	}
    	return 0;
    }
    
    
  • 相关阅读:
    MIPI DIsplay Panel And Linux Driver Model【转】
    Vim|多行行尾插入【转】
    LCD之mipi DSI接口驱动调试流程【转】
    Linux中的DRM 介绍【转】
    linux DRM driver 使用示例【转】
    从零开始写设备树DTS【转】
    linux内核中的宏ffs(x)【转】
    procps工具集 ----Linux中的可用内存指的是什么?【转】
    ps命令交叉编译【转】
    交叉编译Procps-ng-3.3.11【转】
  • 原文地址:https://www.cnblogs.com/lukelmouse/p/11743898.html
Copyright © 2020-2023  润新知