AtCoder_abc331

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;
}

(以下为赛后补题)

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

posted @ 2023-12-03 12:18  某谦  阅读(130)  评论(3编辑  收藏  举报