AtCoder_abc332

发布时间 2023-12-11 08:36:53作者: 某谦

AtCoder_abc332

比赛链接

A - Online Shopping

A题链接

题目大意

这里有\(N\)件商品,第\(i\)件商品价格为\(P_i\),你要购买\(Q_i\)件,除了购买的费用外,他还要支付运费。

如果购买的总价大于\(S\),运费为0元,否则他需要支付\(K\)元的运费。

他一共要花多少钱呢?

解题思路

代码

// Problem: A - Online Shopping
// Contest: AtCoder - AtCoder Beginner Contest 332
// URL: https://atcoder.jp/contests/abc332/tasks/abc332_a
// Memory Limit: 1024 MB
// Time Limit: 2000 ms

#include<bits/stdc++.h>
using namespace std;
int n,s,k,sum;
int main(){
	cin>>n>>s>>k;
	for(int i=1;i<=n;i++){
		int p,q;cin>>p>>q;
		sum+=p*q;
	}
	if(sum<s)
		sum+=k;
	cout<<sum;
	return 0;
}

B - Glass and Mug

B题链接

题目大意

高桥有一个容量为\(G\)的玻璃杯和一个容量为\(M\)的马克杯\((G<M)\)

一开始两个杯子都是空的。

他将执行以下操作\(K\)次:

  • 当玻璃杯装满水时,将玻璃杯中的所有水倒掉。

  • 否则,如果马克杯是空的,就往马克杯里倒满水。

  • 否则,将马克杯里的水倒进玻璃杯中,直到马克杯变空或玻璃杯装满水。

请输出马克杯和玻璃杯最后还剩多少水。

解题思路

模拟就完了

代码

// Problem: B - Glass and Mug
// Contest: AtCoder - AtCoder Beginner Contest 332
// URL: https://atcoder.jp/contests/abc332/tasks/abc332_b
// Memory Limit: 1024 MB
// Time Limit: 2000 ms

#include<bits/stdc++.h>
using namespace std;
int k,g,m;
int main(){
	cin>>k>>g>>m;
	int ng=0,nm=0;
	for(int i=1;i<=k;i++){
		if(ng==g)
			ng=0;
		else if(nm==0)
			nm=m;
		else{
			ng+=nm;
			nm=max(0,ng-g);
			ng-=nm;
		}
	}
	cout<<ng<<" "<<nm;
	return 0;
}

C - T-shirts

C题链接

题目大意

你将得到长度为\(N\)的字符串\(S\),由\(0\)\(1\)\(2\)组成,代表高桥\(N\)天的时间表。

对于整数\(i(1 \le i \le N)\)

  • 如果\(S\)的第\(i\)个字符是\(0\),则他没有为第\(i\)天安排的计划;

  • 如果\(S\)的第\(i\)个字符是\(1\),他计划在第\(i\)天出去吃饭;

  • 如果\(S\)的第\(i\)个字符是\(2\),则他计划在第\(i\)天参加比赛。

高桥有\(M\)件普通的T恤,在第一天之前就已经洗好了,可以穿了。

此外,为了能够满足以下条件,他将购买几件带有AtCoder logo 的T恤(以下简称logo衫):

  • 在他出去吃饭的日子里,他会穿一件普通T恤或logo衫。

  • 在他参加比赛的日子里,他会穿一件logo衫。

  • 在没有计划的日子里,他不会穿任何T恤。此外,他还将清洗当时穿的所有T恤衫。从第二天起,他可以再穿一次。

  • 一旦他穿上T恤,他就不能再穿了,除非他洗了。

确定他需要购买的logo衫的最低数量,以便能够在\(N\)天内的所有预定日期穿着合适的T恤衫。如果他不需要买新T恤,请打印0。

假设购买的logo衫也在第一天之前清洗好并准备好使用。

解题思路

这是一道模拟+贪心,我们可以根据给出的字符串按照如下策略安排T恤:

  • 如果\(S_i\)\(0\),将记录穿过的普通T恤和logo衫的计数器都清零。

  • 如果\(S_i\)为1,判断是否还有能穿的普通T恤。

    • 如果有,就穿一件普通T恤。

    • 否则判断是否还有logo衫。

      • 如果有,就穿一件logo衫。

      • 否则就再购买一件logo衫,然后穿上。

  • 如果\(S_i\)为2,判断是否还有能穿的logo衫。

    • 如果有,就穿一件logo衫。
    • 否则就再购买一件logo衫,然后穿上。

最后只要输出购买的数量就OK啦。

代码

// Problem: C - T-shirts
// Contest: AtCoder - AtCoder Beginner Contest 332
// URL: https://atcoder.jp/contests/abc332/tasks/abc332_c
// Memory Limit: 1024 MB
// Time Limit: 2000 ms

#include<bits/stdc++.h>
using namespace std;
int n,m;
string s;
int cntb,cntc,now;
//cntb:cnt buy表示穿过的logo衫的数量  cntc:cnt common表示穿过的普通T恤的数量  now:计划购买的数量 
int main(){
	cin>>n>>m>>s;
	s=" "+s;//将下标调整为1~N,个人习惯 
	for(int i=1;i<=n;i++){//如解题思路部分所述 
		if(s[i]=='0')
			cntc=0,cntb=0;
		else if(s[i]=='1'){
			if(cntc<m)
				cntc++;
			else if(cntb<now)
				cntb++;
			else
				now++,cntb++;
		}else{
			if(cntb<now)
				cntb++;
			else
				now++,cntb++;
		}
	}
	cout<<now;//输出 
	return 0;//华丽结束 
}

D - 做不出来