本蒟蒻已经掉到灰名了(菜到落泪),希望这次打完能重回绿名吧......
这次赛中A了三题
下面是本蒟蒻的题解
A.Three Piles of Candies
这题没啥好说的,相加除2就完事了
#include<bits/stdc++.h> using namespace std; typedef long long ll; int main() { ll q; scanf("%lld",&q); while(q--) { ll a,b,c; scanf("%lld %lld %lld",&a,&b,&c); printf("%lld\n",(a+b+c)/2); } return 0; }
B.Odd Sum Segments
题意大概就是把长度为n的数组分成k段,每段的总和为奇数,若可以则输出YES和和每段的右边界,否则输出NO。
偶数对结果没有影响,所以只用考虑奇数。记录奇数的个数,只要每段中含有奇数个奇数就行。
那么往前面的k-1段中各放一个奇数,再把剩下的奇数放在最后一段,判断最后一段中的奇数个数是否为奇数,判断后打印前面的奇数位置和n即可。(讲的不太清楚...)
代码如下:
#include<bits/stdc++.h> using namespace std; typedef long long ll; const ll maxn=1e6+5; ll a[maxn]; int main() { ll q; scanf("%lld",&q); while(q--) { ll n,k; scanf("%lld %lld",&n,&k); ll cnt=0; for(ll i=1; i<=n; i++) { scanf("%lld",&a[i]); if(a[i]%2==1) cnt++; } if(cnt>=k&&(cnt-(k-1))%2==1/*判断最后一堆中的奇数个数是否为偶数*/) { printf("YES\n"); ll cnt2=0; for(ll i=1; i<=n; i++) { if(cnt2>=k-1)break; if(a[i]%2==1) { printf("%lld ",i); cnt2++; } } printf("%lld\n",n); } else printf("NO\n"); } return 0; }
C.Robot Breakout
大概就是纯模拟吧,对于每个机器人,记录它能到达的x,y的上下界,然后取个交集,输出交集的左边界。
代码如下:
#include<bits/stdc++.h> using namespace std; typedef long long ll; const ll maxn=1e5+5; const ll INF=1e5; ll a[maxn][4];//储存可达状态 ,a[i][0]为x的下界,a[i][1]为x的上界,a[i][2]为y的下界,a[i][3]为y的上界 int main() { ll q; scanf("%lld",&q); while(q--) { ll n,x,y,f1,f2,f3,f4; scanf("%lld",&n); for(ll i=1;i<=n;i++) { scanf("%lld%lld%lld%lld%lld%lld",&x,&y,&f1,&f2,&f3,&f4); a[i][0]=a[i][1]=x;//上下界都标记为x a[i][2]=a[i][3]=y;//同理 if(f1)a[i][0]=-INF; if(f2)a[i][3]=INF; if(f3)a[i][1]=INF; if(f4)a[i][2]=-INF; } /*for(int i=1;i<=n;i++) { cout<<a[i][0]<<" "<<a[i][1]<<" "<<a[i][2]<<" "<<a[i][3]<<endl; }*/ ll xmax=INF,xmin=-INF,ymax=INF,ymin=-INF; bool flag =true; for(ll i=1;i<=n;i++) { if(a[i][0]>xmax||a[i][1]<xmin||a[i][2]>ymax||a[i][3]<ymin) { printf("0\n"); flag=false; break; } if(xmax>a[i][1])xmax=a[i][1]; if(xmin<a[i][0])xmin=a[i][0]; if(ymax>a[i][3])ymax=a[i][3]; if(ymin<a[i][2])ymin=a[i][2]; } if(flag) { printf("1 %lld %lld\n",xmin,ymin); } } return 0; }
后面的题目赛中没做出来(果然还是我太菜了555)
下午补了题晚上再把个人的题解放上来
---------------------------------------------------------------------------------------------------------------------分割线----------------------------------------------------------------------------------------------------------------------------------------------------
又颓了一整天5555
晚上补了昨晚cf的D题
发现D1还是很好写的嘛,随便暴力写都能过(毕竟数据小),昨天赛中的时候还把他想成了LCS,还想套模板233333
D2数据大了我的暴力写法直接TLE了,想了半天没办法看了题解。题解的写法是真的优雅。
下面贴出来我的代码(无脑写)和题解的代码(题解的我写了点注释方便理解)。
D1.RGB Substring (easy version)
#include<bits/stdc++.h> using namespace std; typedef long long ll; const ll maxn=1e6+5; int main() { ll q; scanf("%lld",&q); while(q--) { ll n,k; scanf("%lld %lld",&n,&k); string s; cin>>s; ll mi=maxn; for(int i=0;i<=n-k;i++) { ll cnt1=0,cnt2=0,cnt3=0; string b=s.substr(i,k); for(int i=0;i<b.length();i++) { if((i%3==0&&b[i]=='R')||(i%3==1&&b[i]=='G')||(i%3==2&&b[i]=='B')) { cnt2++; cnt3++; } if((i%3==0&&b[i]=='G')||(i%3==1&&b[i]=='B')||(i%3==2&&b[i]=='R')) { cnt1++; cnt3++; } if((i%3==0&&b[i]=='B')||(i%3==1&&b[i]=='R')||(i%3==2&&b[i]=='G')) { cnt1++; cnt2++; } } if(mi>min(cnt1,min(cnt2,cnt3))) { mi=min(cnt1,min(cnt2,cnt3)); } } printf("%lld\n",mi); } return 0; }
D2.RGB Substring (hard version)
题解真的tql
#include <bits/stdc++.h> using namespace std; int main() { //#ifdef _DEBUG //freopen("input.txt", "r", stdin); // freopen("output.txt", "w", stdout); //#endif const string t = "RGB"; int q; cin >> q; for (int i = 0; i < q; ++i) { int n, k; string s; cin >> n >> k >> s; int ans = 1e9; for (int offset = 0; offset < 3; ++offset) { vector<int> res(n); int cur = 0; for (int j = 0; j < n; ++j) { res[j] = (s[j] != t[(j + offset) % 3]);//对应的若不相同 cur += res[j];//cur是当前的需要改变的字母数量 if (j >= k) cur -= res[j - k];// 若j>=k则把当前的cur减去res[j-k](因为此时这个位置与要计算的位置不在同个字串) if (j >= k - 1) ans = min(ans, cur);/ } } cout << ans << endl; } return 0; }
不能颓废啊啊啊啊啊啊啊啊
好好休息好好补知识点!!!
E和F题不打算补了,接下来去学DFS和BFS了,之前稍微了解了一下做了一两道题发现还是不熟练,得多刷点题。
ok那这篇随笔就这样吧。
PS:我永远喜欢远坂凛