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       
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补题计划的主要内容,如果未能解决你的问题,请参考以下文章

移动版SRM

补题计划

SDWC补题计划--基础班DAY1

Topcoder SRM556DIV. OldBridges

srm系统在企业的应用

企业为什么要用SRM系统替代ERP系统来管理供应商