比赛链接:ABC346
Problem A:
签到题。
#include <bits/stdc++.h>
using namespace std;
const int maxn=105;
int A[105],B[105];
int main(){int N;cin>>N;for(int i=1;i<=N;i++)cin>>A[i];for(int i=1;i<N;i++){B[i]=A[i+1]*A[i];cout<<B[i]<<endl;}return 0;
}
Problem B:
这题并不需要什么高级的玩意,只用把S复制几遍,然后暴力判断即可。(思路源于tourist的代码)
#include <bits/stdc++.h>
using namespace std;
int main(){string S="wbwbwwbwbwbw";while(S.size()<10000)S+=S;int W,B;cin>>W>>B;for(int i=0;i<((int)S.size()-W-B);i++){string t=S.substr(i,W+B);if(count(t.begin(),t.end(),'w')==W){cout<<"Yes"<<endl;return 0;}}//cout<<"No"<<endl;return 0;
}
Problem C:
把A扔到一个set里,然后遍历set即可。时间复杂度。
//long long
#include <bits/stdc++.h>
using namespace std;
const int maxn=200005;
int A[maxn];
set<int> st;
int main(){long long N,K;cin>>N>>K;for(int i=1;i<=N;i++){cin>>A[i];st.insert(A[i]);}int ans=(1+K)*K/2;for(int x:st){if(1<=x && x<=K)ans-=x;}cout<<ans<<endl;return 0;
}
Problem D:
Why DP?????????????????????????????????????????????????????
我们令表示当前的状态。i是第i个字符,j是当前字符选不选,k是是否有连续。
然后我们分类讨论这个字符和上一个字符是否相同即可。
//long long
#include <bits/stdc++.h>
using namespace std;
const int maxn=200005;
int C[maxn],dp[maxn][2][2];
int main(){int N;string S;cin>>N>>S;memset(dp,0x3f3f3f3f,sizeof(dp));for(int i=0;i<N;i++)cin>>C[i];dp[0][0][0]=0;dp[0][1][0]=C[0];for(int i=1;i<N;i++){if(S[i]==S[i-1]){dp[i][1][0]=min(dp[i][1][0],dp[i-1][0][0]+C[i]);dp[i][0][0]=min(dp[i][0][0],dp[i-1][1][0]);dp[i][0][1]=min(dp[i][0][1],min(dp[i-1][0][0],dp[i-1][1][1]));dp[i][1][1]=min(dp[i][1][1],min(dp[i-1][0][1],dp[i-1][1][0])+C[i]);}else{dp[i][1][0]=min(dp[i][1][0],dp[i-1][1][0]+C[i]);dp[i][0][0]=min(dp[i][0][0],dp[i-1][0][0]);dp[i][0][1]=min(dp[i][0][1],min(dp[i-1][1][0],dp[i-1][0][1]));dp[i][1][1]=min(dp[i][1][1],min(dp[i-1][1][1],dp[i-1][0][0])+C[i]);}}cout<<min(dp[N-1][1][1],dp[N-1][0][1])<<endl;return 0;
}
Problem E:
直接模拟必然超时,考虑倒序(你前面最多少次都没用,会被覆盖)。然后,比方说,第x行染成1,后续进行了y次列的染色,所以这一行有x-y个颜色为1的格子。把这些记录下来即可。
int row,col;
long long H,W,M;
long long res[maxn];
map<pair<long long,long long>,bool> mp;
vector<pair<long long,long long>> ans;
struct cell{long long t;long long a;long long x;
}grid[maxn];
void work(long long t,long long a,long long x){pair<long long,long long> op={t,a};if(mp.count(op))return;mp[op]=true;if(t==1){res[x]+=W-row;++col;}else{res[x]+=H-col;++row;}
}
int main(){cin>>H>>W>>M;for(int i=1;i<=M;i++)cin>>grid[i].t>>grid[i].a>>grid[i].x;for(int i=M;i>0;--i)work(grid[i].t,grid[i].a,grid[i].x);for(int i=1;i<=H;i++)work(1,i,0);for(int i=0;i<=200000;i++){if(res[i])ans.push_back(make_pair(i,res[i]));}cout<<ans.size()<<endl;for(auto x:ans)cout<<x.first<<' '<<x.second<<endl;
}
以上就是本期的全部内容了,我们下期再见!