题目连接
Codeforces Round #581 (Div. 2)
A
思路
这题,打比赛的时候没注释freopen,然后自闭半天。
我们可以把二进制转换成四进制,每两个数字看作一个四进制。
然后特判10000这种情况和10001这种情况的差别就可以过了。
代码实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| #include<bits/stdc++.h> using namespace std; #define ll long long int main() { string s; cin>>s; int len = s.size(); int ans=0; bool ok =false; if(s.size()%2==0) ans=len/2; else { for(int i=1;i<s.size();i++) { if(s[i]=='1') { ok=true; break; } } if(ok)ans=(len+1)/2; else ans=len/2; } cout<<ans<<endl; }
|
B
思路
贪心即可,维护一个不大于1<<20的前缀和,然后最小的就是补1,最大的就是补1<<r即可;
代码实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| #include<bits/stdc++.h> using namespace std; #define ll long long long long a[22]; long long pre[22]; int main() { int n,l,r; scanf("%d%d%d",&n,&l,&r); for(int i=0;i<=20;i++) { a[i]=pow(2,i); if(i==0)pre[i]=a[i]; else pre[i]=a[i]+pre[i-1]; } ll minn=0,maxx=0; minn+=pre[l-1]; minn+=n-l; maxx+=pre[r-1]; if(n-r>0) { maxx+=a[r-1]*(n-r); } cout<<minn<<" "<<maxx<<endl; }
|
C
思路
用floyd先跑出最短路,然后我们来处理主串的数组,当两点之间的距离等于他们之间的长度并且中间的数都联通时,即可把中间的消除,那么用栈来模拟一下,一个栈存答案,另一个维护当前能够满足上述情况的点。
代码实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66
| #include<bits/stdc++.h> using namespace std; #define ll long long #define pb push_back const int maxn = 1e2+10; const int N = 1e6+10; int dp[maxn][maxn]; int a[N]; int n,m; vector<int>ans; vector<int>res; void floyd() { for(int k=1;k<=n;k++) for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) { dp[i][j]=min(dp[i][j],dp[i][k]+dp[k][j]); } } int main() { scanf("%d",&n); char c; getchar(); memset(dp,0x3f,sizeof(dp)); for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { scanf("%c",&c); if(c=='1')dp[i][j]=1; } getchar(); } floyd(); for(int i=1;i<=n;i++)dp[i][i]=10000000; scanf("%d",&m); int x; scanf("%d",&x); ans.pb(x); res.pb(x); int now = x; for(int i=1;i<m;i++) { scanf("%d",&x); if(dp[res[0]][x]==res.size()) { res.pb(x); } else { ans.pb(res[res.size()-1]); int end = res[res.size()-1]; res.clear(); res.pb(end); if(dp[res[0]][x]==res.size())res.pb(x); } } if(!res.empty())ans.pb(res[res.size()-1]); cout<<ans.size()<<endl; for(auto k : ans) { cout<<k<<" "; } }
|