SRM补题计划
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SRM补题计划相关的知识,希望对你有一定的参考价值。
退役选手没事干也就只能补补题了。。。
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
看着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
......
以上是关于SRM补题计划的主要内容,如果未能解决你的问题,请参考以下文章