【比赛笔记】AtCoder Beginner Contest 267笔记

目录

A - Saturday 

题目链接

题目描述

题目分析

题目代码

B - Split?

题目链接

题目描述

 题目分析

题目代码 

C - Index × A(Continuous ver.)

题目链接

题目描述

 题目分析

题目代码 

我的Atcoder账号


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使得\sum_{i=1}^{M}i*B_i的值最大,输出算式的最大值即可

 题目分析

其实只需要用滑动窗口配合上前缀和即可,每次在结果中加上新一位的结果,即在窗口中的索引乘数值,接着再减去窗口前几位的和即可。这种方法既没有数学解那样烧脑,也不会像暴力解那样会超时

题目代码 

#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!!!

我的Atcoder账号

FrankChttps://atcoder.jp/users/FrankC

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值