AtCoder_abc331

发布时间 2023-12-03 12:20:15作者: 某谦

AtCoder_abc331

(这次题真的真的真的好难)

比赛链接

A - Tomorrow

题目链接

题目大意

有一个$M$个月,$D$天的日历,请输出$y年m月z日$的下一天。

解题思路

先让天数加一,如果超过了$D$就让月份加一,天数减$D$,然后月份同理

代码

// Problem: A - Tomorrow
// Contest: AtCoder - Daiwa Securities Co. Ltd. Programming Contest 2023(AtCoder Beginner Contest 331)
// URL: https://atcoder.jp/contests/abc331/tasks/abc331_a
// Memory Limit: 1024 MB
// Time Limit: 2000 ms

#include<bits/stdc++.h>
using namespace std;
int M,D;
int y,m,d;
int main(){
	cin>>M>>D;
	cin>>y>>m>>d;
	d++;
	if(d>D)
		m++,d-=D;
	if(m>M)
		y++,m-=M;
	cout<<y<<" "<<m<<" "<<d;
	return 0;
}

B - Buy One Carton of Milk

题目链接

题目大意

一个超市正在卖三种规格的鸡蛋

  • 一盒有6个,花$S$块钱
  • 一盒有8个,花$M$​块钱
  • 一盒有12个,花$L$块钱

请求出如果要买$N$个鸡蛋最少要花多少钱

解题思路

看到这题我知道三重循环$O(n^3)$暴力枚举在数据范围是$1 \le N \le 100$肯定是能过,但我不知道犯什么抽去写背包dp,好在最后是没写挂。

代码

// Problem: B - Buy One Carton of Milk
// Contest: AtCoder - Daiwa Securities Co. Ltd. Programming Contest 2023(AtCoder Beginner Contest 331)
// URL: https://atcoder.jp/contests/abc331/tasks/abc331_b
// Memory Limit: 1024 MB
// Time Limit: 2000 ms

#include<bits/stdc++.h>
using namespace std;
int dp[100000];
int n,a[5],b[5]={0,6,8,12};
int main(){
	cin>>n>>a[1]>>a[2]>>a[3];
	memset(dp,0x3f,sizeof(dp));
	dp[0]=0;
	for(int i=1;i<=3;i++)
		for(int j=b[i];j<=n+12;j++)
			dp[j]=min(dp[j],dp[j-b[i]]+a[i]);
	int minn=INT_MAX;
	for(int i=n;i<=n+12;i++){
		minn=min(minn,dp[i]);
	}
	cout<<minn;
	return 0;
}

C - Sum of Numbers Greater Than Me

题目链接

题目大意

输入一个长度为$N$的序列$A$,对于每一个$a_i(1 \le i \le N)$,输出所有比$a_i$大的数的和

解题思路

这题一眼前缀和,需要注意的是题目中要求输出"所有比$a_i$大的数的和",所以输出前缀和的时候要注意把等于$a_i$的值排除在外

代码

// Problem: C - Sum of Numbers Greater Than Me
// Contest: AtCoder - Daiwa Securities Co. Ltd. Programming Contest 2023(AtCoder Beginner Contest 331)
// URL: https://atcoder.jp/contests/abc331/tasks/abc331_c
// Memory Limit: 1024 MB
// Time Limit: 2000 ms

#include<bits/stdc++.h>
using namespace std;
int n;
long long mad;
long long a[200005];
long long sum[1000006];
int main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>a[i];
		mad=max(mad,a[i]);
		sum[a[i]]+=a[i];
	}
	for(int i=mad;i>=1;i--)
		sum[i]+=sum[i+1];
	for(int i=1;i<=n;i++)
		cout<<sum[a[i]+1]<<" ";
	return 0;
}

(以下为赛后补题)

(未完待续,困死了,明天再补,如果我忘了请看到这的人提醒我一声)