CodeForces 1204 (#581 div 2)
傳送門
A.BowWow and the Timetable
?題意
給你一個二進制數,讓你求小于這個數的所有4的冪的個數
?思路
第一反應是二進制與四進制轉換
(其實不用真正的轉換 QwQ)
由于二進制的兩位對應四進制的一位
所以可以得到四進制下的位數
四進制的位數就是小于等于這個數的所有4的冪的個數,類比10進制下10的冪
由于不能有等于,所以根據二進制判斷一下這個數是不是4的冪
因為12,1002,100002 ,二進制下4的冪除了首位的1,后面是偶數個0
所以判斷是否是1帶偶數個0,是的話個數減一
?代碼
1 #include<bits/stdc++.h> 2 using namespace std; 3 const int maxn=1e6+5; 4 char s[maxn]; 5 int main() 6 { 7 scanf("%s",s+1); 8 int len=strlen(s+1),flag=0; 9 int cnt=(len+1)/2; 10 for(int i=2;i<=len;i++) 11 if(s[i]=='0') flag++; 12 if(flag==len-1 && len&1) 13 cnt--; 14 printf("%d\n",cnt); 15 } View Code?
B.Mislove Has Lost an Array
?題意
數組中只存在$1$或者$x$
$x$是偶數并且$x/2$必須在數組中存在
給定$l,r$數組中最少有$l$個不同的數,最多有$r$個不同的數
求數組里數的和的最小最大值
?思路
最小值是有$1,2,4...$等$l$個數,如果不足n個用$1$補齊
最大值是有$1,2,4...$等$r$個數,如果不足用這$r$個數中最大的補齊
?代碼
1 #include<bits/stdc++.h> 2 using namespace std; 3 #define ll long long 4 int main() 5 { 6 int n,l,r; 7 cin>>n>>l>>r; 8 ll Min=0; 9 int cnt,i; 10 for(i=1,cnt=1;i<=l;cnt*=2,i++) 11 Min+=cnt; 12 Min+=(n-l); 13 14 ll Max=0; 15 for(cnt=1,i=1;i<=min(n,r);cnt*=2,i++) 16 Max+=cnt; 17 cnt/=2; 18 if(r<=n) 19 Max+=1ll*(n-r)*cnt; 20 cout<<Min<<' '<<Max<<endl; 21 } View Code?
C.?Anna, Svyatoslav and Maps
?題意
給出鄰接矩陣表示一個有向圖
"1"代表有路,"0"代表沒有路
給出長度為$m$的序列,表示一條最短路
求,這個序列的一個子序列s,
滿足這個子序列s的最短路是m的序列,且s最短
?思路
由于從一個點到另一個點的路徑可能不止一條
一旦固定了路徑,那么從這個點到另一個點不必須經過的點如果在固定的路徑中的話
就必須有,防止從其它點經過
二那些必須經過的點,就不用有了,因為要使長度最短
固定路徑1,2,3,4
1可以直接到3而不必須經過2,但是固定路徑里有2
所以2必須存在,才能使得經過1,2
2到4必須經過3,所以2->4路徑有存在了3
為了使s最短,3不會有
?代碼
1 #include<bits/stdc++.h> 2 using namespace std; 3 #define inf 0x3f3f3f3f 4 const int maxn=1e6+5; 5 char s[105][105]; 6 int dis[105][105]; 7 int a[maxn],ans[maxn]; 8 int n,m; 9 10 void Init() 11 { 12 for(int i=1;i<=n;i++) 13 { 14 for(int j=1;j<=n;j++) 15 { 16 dis[i][j]=inf; 17 if(i==j) dis[i][j]=0; 18 if(s[i][j]=='1') dis[i][j]=1; 19 } 20 } 21 } 22 23 void floyd() 24 { 25 for(int k=1;k<=n;k++) 26 for(int i=1;i<=n;i++) 27 for(int j=1;j<=n;j++) 28 dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]); 29 } 30 31 int main() 32 { 33 scanf("%d",&n); 34 for(int i=1;i<=n;i++) 35 scanf("%s",s[i]+1); 36 Init(); 37 floyd(); 38 39 scanf("%d",&m); 40 for(int i=1;i<=m;i++) 41 scanf("%d",a+i); 42 43 int cnt=0; 44 ans[++cnt]=a[1];///首 45 int pre=a[1]; 46 for(int i=2;i<=m;i++) 47 { 48 int cur=a[i-1]; 49 int nex=a[i]; 50 if(pre==cur) 51 continue; 52 ///要不必須經過的點 53 ///不要必須經過的點 54 if(dis[pre][cur]+dis[cur][nex]!=dis[pre][nex]) 55 { 56 ans[++cnt]=cur; 57 pre=cur; 58 } 59 } 60 ans[++cnt]=a[m];///尾 61 62 printf("%d\n",cnt); 63 for(int i=1;i<=cnt;i++) 64 printf("%d ",ans[i]); 65 puts(""); 66 } View Code?
D.Kirk and a Binary String?
?題意
給你一個$01$字符串s,讓你找到一個t串,使得
- t串與s串的區間所有單調非遞減長度相同
- t串中0個數最多
?思路
對于一個字符串,當前位置有$0,1$兩種情況
- 當前位置是0
當前位置是0,對于以他為起點的單調非遞減子序列肯定有貢獻,
如果變為1,大多數情況下長度會減小(除了0后面全是1的情況,011111長度不變)
如果變為1,0的數量比不變減少違背第二個任務
- 當前位置是1
如果變為0,對于以他(也就是以1) 為起點的單調非遞減子序列來說,長度無影響
對于以0為起點的單調非遞減子序列來說,長度會受到影響
既然想要更多的0,那就需要盡可能的把1 變成0,那如何才能沒有影響呢?
那就需要以他(也就是以1) 為起點的單調非遞減子序列的長度大于以0為起點的單調非遞減子序列長度
因為影響大局的最長的那個,那就讓即使小的變化了,也不會對大局產生影響!
換句話說,若想將$1$ 變為 $0$ ,必須保證后面所有的區間的單調非遞減子序列長度必須和 1 的個數相等
也就是從后往前找,當$1$的個數大于$0$的個數時,$1$才可以變成$0$
?代碼
1 #include<bits/stdc++.h> 2 using namespace std; 3 #define ll long long 4 const int maxn=1e6+4; 5 char s[maxn]; 6 int a[maxn]; 7 int main() 8 { 9 scanf("%s",s+1); 10 int len=strlen(s+1); 11 int cnt=0; 12 for(int i=len;i>=1;i--) 13 { 14 if(s[i]=='0') 15 cnt++; 16 else 17 { 18 if(cnt) --cnt; 19 else s[i]='0'; 20 } 21 } 22 23 printf("%s",s+1); 24 } View Code?
?
轉載于:https://www.cnblogs.com/MMMinoz/p/11511281.html
總結
以上是生活随笔為你收集整理的CodeForces 1204 (#581 div 2)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [PHP] PHP调用IMAP协议读取邮
- 下一篇: golang gorm 基本使用