AtCoder Beginner Contest 210

https://atcoder.jp/contests/abc210/tasks/abc210_a

A - Cabbages

水题。

题意:你要去超市买n颗卷心菜,前a颗每颗卖x元,后面的每颗卖y元,问你需要带多少元。

思路:先判断a是否大于等于n,如果大于需要带x*n元,否则带x*a+(n-a)*y元。

代码:

#include<bits/stdc++.h>
#define ll long long
#define rep(a,b,c) for(int a=b;a<=c;a++)
#define per(a,b,c) for(int a=b;a>=c;a--)
#define hh 0x3f3f3f3f
const int maxn=1e5+5;
using namespace std;
inline int read()
{
	ll s=0,f=1;
	char c=getchar();
	while(c>'9'||c<'0'){if(c=='-')f=-1;c=getchar();}
	while(c>='0'&&c<='9'){s=(s<<3)+(s<<1)+c-'0';c=getchar();}
	return s*f;
}
void solve()
{
	ll n,a,x,y;
	cin>>n>>a>>x>>y;
	if(a>=n)cout<<n*x;
	else
	{
		cout<<a*x+(n-a)*y;
	}
}
int main()
{
	ios::sync_with_stdio(0);cout.tie(0);cin.tie(0);
	int t=1;
	while(t--)solve();
	return 0;
}

https://atcoder.jp/contests/abc210/tasks/abc210_b

B - Bouzu Mekuri

水题。

题意:给你一副牌,这副牌只包含1和0,每个人轮流摸,谁先摸到1就输出谁的名字。

玩家:Takahashi and Aoki ,Takahashi先手。

思路:一个循环,当到第一个1时如果i是奇数就输出Takahashi,反之就输出Aoki,游戏结束。

代码:

#include<bits/stdc++.h>
#define ll long long
#define rep(a,b,c) for(int a=b;a<=c;a++)
#define per(a,b,c) for(int a=b;a>=c;a--)
#define hh 0x3f3f3f3f
const int maxn=1e5+5;
using namespace std;
inline int read()
{
	ll s=0,f=1;
	char c=getchar();
	while(c>'9'||c<'0'){if(c=='-')f=-1;c=getchar();}
	while(c>='0'&&c<='9'){s=(s<<3)+(s<<1)+c-'0';c=getchar();}
	return s*f;
}
char s[maxn];
int n;
void solve()
{
	cin>>n;
	cin>>s+1;
	for(int i=1;i<=strlen(s+1);i++)
	{
		if(s[i]=='1')
		{
			if(i%2==0)
			{
				cout<<"Aoki";
			}
			else cout<<"Takahashi";
			return ;
		}
	}
}
int main()
{
	ios::sync_with_stdio(0);cout.tie(0);cin.tie(0);
	int t=1;
	while(t--)solve();
	return 0;
}

  

https://atcoder.jp/contests/abc210/tasks/abc210_c

C - Colorful Candies

题意:给你n颗,每颗糖都有自己的颜色(用表示),给你一个k,让你取k颗连续的糖果,问你怎么取,使得你手中的糖果不同颜色的颗数最多?

比如:

n=7 k=3
1 2 1 2 3 3 1

你可以从第三糖取到第五颗糖,他们的颜色分别是1,2,3这是你的答案就是3(因为有三种不同颜色的糖果)。

思路O(n):队列

我们可以把k看成一个长度位k的数组s,你只要把这个s在原数组从左到右扫一遍就能得到结果。当然题目给的数据过大,显然我们不能用正常的数组来存放我们想要的东西,因此我们用map容器来帮我们记录。

首先我们需要三个map数组。f、s、pd。f用来装原数组,s表示k长度的数组,pd用来判断我们s中糖果对应颜色的颗数。比如假设在s数组中1 2 1 3 3 3  那么pd[1]=2;pd[2]=1;pd[3]=3;

显然从左到右到的时候分为两个阶段:for(int i=1;i<=n;i++)

第一个阶段:当 i 小于等于 k 时,我们s头指针(top)不需要移动,并且给我们存的数据用pd来标记,如果是第一次标记,那我们用tp+1(tp表示当前s数组中不同颜色的个数),否则我们就让pd++。最后更新答案ans=max(ans,tp)。

第二个阶段:当i大于 k 时,我们先让头指针(top)对应的标记-1,如果对应的标记-1后为0就让我们的tp-1,否则就不用动。再看尾指针(f[i]),先判断f[i],是否第一次标记,如果是就让tp+1并且pd[f[i]]++,否则就让pd[f[i]]++。最后让头指针top+1,更新答案ans=max(ans,tp)。

#include<bits/stdc++.h>
#define ll long long
#define rep(a,b,c) for(int a=b;a<=c;a++)
#define per(a,b,c) for(int a=b;a>=c;a--)
#define hh 0x3f3f3f3f
const int maxn=3e5+5;
using namespace std;
inline int read()
{
	ll s=0,f=1;
	char c=getchar();
	while(c>'9'||c<'0'){if(c=='-')f=-1;c=getchar();}
	while(c>='0'&&c<='9'){s=(s<<3)+(s<<1)+c-'0';c=getchar();}
	return s*f;
}
map<ll,int>f,s,pd;
ll k,n,ans=-1;
void solve()
{
	cin>>n>>k;
	for(int i=1;i<=n;i++)cin>>f[i];
	ll top=1,tp=0;
	for(int i=1;i<=n;i++)
	{
		if(i<=k)//第一个阶段 
		{
			if(pd[f[i]]!=0)//判断f[i]是否第一次标记 
				pd[f[i]]++;//不是第一次标记 
			else
			{
				pd[f[i]]++;//是第一次标记 
				tp++;//第一次标记,说明不同颜色个数+1 
			}
			s[i]=f[i];//让f[i]加入s数组中 
			ans=max(ans,tp);//更细答案 
		}
		else//第二个阶段 
		{
			pd[s[top]]--;//头指针颜色标记-1 
			if(pd[s[top]]==0)//说明头指针颜色在s数组中是第一次标记 
				tp--;//不同颜色个数-1 
			if(pd[f[i]]!=0)//判断尾指针是否第一次标记 
				pd[f[i]]++;//不是第一次标记 
			else
			{
				pd[f[i]]++;//是第一次标记 
				tp++;//不同颜色+1 
			}
			s[i]=f[i];//让f[i]加入s数组中 
			top++;//头指针往后移 
			ans=max(ans,tp);//更新答案 
		}
	}
	cout<<ans;
}
int main()
{
	ios::sync_with_stdio(0);cout.tie(0);cin.tie(0);
	int t=1;
	while(t--)solve();
	return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值