1. 程式人生 > >SRM補題計劃

SRM補題計劃

== using string 進制 algorithm 等於 nbsp urn 很好

退役選手沒事幹也就只能補補題了。。。

SRM 01 (這場沒打QAQ)

A.Amusing

一個數組後面每次放個1,如果等於前一個數a就合並到前一個數變成a+1

模擬很好寫。。

技術分享
 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <algorithm>
 5 #include <queue>
 6 #include <stack>
 7 #include <cmath>
 8 #define out(a) printf("%d ",a)
 9
#define ll long long 10 using namespace std; 11 int n,num=0; 12 int cnt=0; 13 bool f; 14 int a[100050]; 15 int read() 16 { 17 int s=0,t=1; char c; 18 while (c<0||c>9){if (c==-) t=-1; c=getchar();} 19 while (c>=0&&c<=9){s=s*10+c-0; c=getchar();} 20 return s*t; 21 }
22 int main() 23 { 24 n=read(); 25 for (int i=1;i<=n;i++) { 26 a[++cnt]=1; 27 while (a[cnt]==a[cnt-1]) { 28 a[cnt-1]++; cnt--; 29 } 30 } 31 for (int i=1;i<=cnt;i++) 32 out(a[i]); 33 } 34 35 36
View Code

看著zz的代碼看了好久發現是有一個規律可以用二進制來寫。

規律就是n的二進制下等於1的數字位置。所以可以直接用位運算&

技術分享
 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <algorithm>
 5 #include <queue>
 6 #include <stack>
 7 #include <cmath>
 8 #define out(a) printf("%d ",a)
 9 #define ll long long
10 using namespace std;
11 int n,num=0;
12 int cnt=0;
13 bool f;
14 int a[100050];
15 int read()
16 {
17     int s=0,t=1; char c;
18     while (c<0||c>9){if (c==-) t=-1; c=getchar();}
19     while (c>=0&&c<=9){s=s*10+c-0; c=getchar();}
20     return s*t;
21 }
22 int main()
23 {
24     n=read();  
25     for (int i=23;i>=0;i--) 
26       if ((n&(1<<i))>0) out(i+1);
27     return 0;
28 }
29       
30         
31       
View Code

......

SRM補題計劃