比赛链接: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;
}
以上就是本期的全部内容了,我们下期再见!