目录
C - Index × A(Continuous ver.)
A - Saturday
题目链接
A - Saturdayhttps://atcoder.jp/contests/abc267/tasks/abc267_a
题目描述
给你一个代表星期几的字符串,问你还有几天到周末
题目分析
直接用map容器把星期几和到周末的天数对应起来,然后直接输出即可
题目代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
int gcd(int a,int b){return b?gcd(b,a%b):a;}
int lcm(int a,int b){return a/(gcd(a,b))*b;}
map <string,int> mp;
signed main(){
mp["Monday"]=5;
mp["Tuesday"]=4;
mp["Wednesday"]=3;
mp["Thursday"]=2;
mp["Friday"]=1;
string s;
cin>>s;
cout<<mp[s]<<endl;
return 0;
}
//ACplease!!!
B - Split?
题目链接
B - Split?https://atcoder.jp/contests/abc267/tasks/abc267_b
题目描述
有十个瓶柱按如下的方式摆放,给你一个字符串表示每个瓶柱被击倒的情况,0表示被击倒,1表示没有被击倒,问你是否满足以下情况:
- 第一个瓶柱被击倒
- 存在满足以下要求的两个不相同的纵行:
◦ 两个纵行上都有未被击倒的瓶柱
◦ 两纵列之间存在一个所有瓶柱都被击倒的纵行
题目分析
我们可以用一个数组来记录每个纵行是否仍有未被击倒的瓶柱,然后再按题目要求判断就行了,不过要记得判断特例
题目代码
#include<bits/stdc++.h>
using namespace std;
int gcd(int a,int b){return b?gcd(b,a%b):a;}
int lcm(int a,int b){return a/(gcd(a,b))*b;}
string s;
signed main(){
cin>>s;
s=" "+s;
// cout<<s<<endl;
if(s[1]=='1'){
cout<<"No"<<endl;
return 0;
}
bool c[8];
c[1]=(s[7]=='1');
c[2]=(s[4]=='1');
c[3]=(s[2]=='1')||(s[8]=='1');
c[4]=(s[1]=='1')||(s[5]=='1');
c[5]=(s[3]=='1')||(s[9]=='1');
c[6]=(s[6]=='1');
c[7]=(s[10]=='1');
for(int i=1;i<=7;i++){
for(int j=i+2;j<=7;j++){
if(c[i]&&c[j]){
for(int k=i+1;k<j;k++){
if(!c[k]){
cout<<"Yes"<<endl;
return 0;
}
}
}
}
}
cout<<"No"<<endl;
return 0;
}
//ACplease!!!
C - Index × A(Continuous ver.)
题目链接
C - Index × A(Continuous ver.)https://atcoder.jp/contests/abc267/tasks/abc267_c
题目描述
给你一个长度为N的A数组,请你求出一个长度为M的A数组的连续子序列B使得的值最大,输出算式的最大值即可
题目分析
其实只需要用滑动窗口配合上前缀和即可,每次在结果中加上新一位的结果,即在窗口中的索引乘数值,接着再减去窗口前几位的和即可。这种方法既没有数学解那样烧脑,也不会像暴力解那样会超时
题目代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
int gcd(int a,int b){return b?gcd(b,a%b):a;}
int lcm(int a,int b){return a/(gcd(a,b))*b;}
int n,m;
int a[200005],s[200005];
signed main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>a[i];
s[i]=s[i-1]+a[i];
}
int ans=0,temp;
for(int i=1;i<=m;i++){
ans+=i*a[i];
}
temp=ans;
for(int i=m+1;i<=n;i++){
temp+=m*a[i];
temp-=(s[i-1]-s[i-m-1]);
ans=max(ans,temp);
}
cout<<ans<<endl;
return 0;
}
//ACplease!!!