SRM補題計劃
阿新 • • 發佈:2017-10-18
== 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) 9View Code#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
看著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 31View Code
......
SRM補題計劃