CSP-J Day 2 模拟赛补题报告

19 篇文章 1 订阅
5 篇文章 0 订阅

upd: T4 重新上传 AC 代码,一开始的有 hack。

姓名:王胤皓,校区:和谐校区,考试时间: 2024 2024 2024 10 10 10 2 2 2 9 : 00 : 00 9:00:00 9:00:00~ 12 : 30 : 00 12:30:00 12:30:00,学号: S 07738 S07738 S07738

请关注作者的 B 站,谢谢~链接

CSP-J Day 2 2 2 模拟赛补题报告

前言

考了我们班 Rank 2 2 2

分数

T1 chess: A c c e p e t e d   100 \color{green}Accepeted\space100 Accepeted 100
T2 BigWater: A c c e p e t e d   100 \color{green}Accepeted\space100 Accepeted 100
T3 delnum: W r o n g _ a n s w e r   20 \color{red}Wrong\_answer\space20 Wrong_answer 20
T4 candy: T L E & W r o n g _ A n s w e r   5 5 \color{orange}TLE\color{black}{\&}\color{red}Wrong\_Answer\space\color{orange}5\color{red}5 TLE&Wrong_Answer 55

T1

题面

在这里插入图片描述

思路

贪心。

让输入的最后一个数字最大,第二个次大,第一个最小,然后计算,排序,就完了。

代码

#include<bits/stdc++.h>
using namespace std;
struct node{
	long long sum,i;
}t[100005];
bool cmp(node a,node b){
	if(a.sum==b.sum) return a.i<b.i;
	else return a.sum>b.sum;
}
int main(){
	freopen("chess.in","r",stdin);
	freopen("chess.out","w",stdout);
	int n;
	cin>>n;
	for(int i=1; i<=n; i++){
		int a,b,c;
		cin>>a>>b>>c;
		b+=a/3;
		a%=3;
		c+=b/3;
		b%=3;
		t[i].sum=18*1ll*c+3*1ll*b+1ll*a;
		t[i].i=i;
	}
	sort(t+1,t+n+1,cmp);
	for(int i=1; i<=n; i++) cout<<t[i].i<<" ";
	return 0;
}

T2

题面

在这里插入图片描述

思路

首先,我们发现,他走的一定是一个长方形的边框,如果再转一次,那么就永远出不来了,所以使用二维前缀和,然后计算最大值,请注意,一开始最大值赋值为一个非常小的负数,最后再加上 100 100 100 就行了。

代码

#include<bits/stdc++.h>
using namespace std;
int n,a[1005][1005];
int main(){
	freopen("BigWater.in","r",stdin);
	freopen("BigWater.out","w",stdout);
	cin>>n;
	for(int i=1; i<=n; i++){
		for(int j=1; j<=n; j++){
			cin>>a[i][j];
			a[i][j]=a[i][j]+a[i-1][j]+a[i][j-1]-a[i-1][j-1];
		}
	}
	int ans=-0x3f3f3f3f;
	for(int i=2; i<=n; i++){
		for(int j=2; j<=n; j++){
			ans=max(ans,a[1][j]+a[i][1]+(a[i][j]-a[i-1][j]-a[i][1]+a[i-1][1])+(a[i-1][j]-a[i-1][j-1]-a[1][j]+a[1][j-1]));
		}
	}
	cout<<100+ans;
	return 0;
}

T3

题面

在这里插入图片描述

思路

如果删除的 x x x 的范围为: a i ≤ x ≤ a i + 1 a_i\le x\le a_{i+1} aixai+1,此时可以删除 x x x i i i 个数, x x x 发生变化,后面不用考虑。

如果 a i = x a_i=x ai=x,结束,输出。

如果最后也没有删除,那么输出 0 0 0

综上,我们需要考虑的是 a i ≤ x ≤ a i + 1 a_i\le x\le a_{i+1} aixai+1 中的 i i i 的位置。

可以发现, i i i递减的,所以说,总时间复杂度为 O ( n ) O(n) O(n)

代码

#include<bits/stdc++.h>
using namespace std;
#define int long long
signed main(){
	int n;
	cin>>n;
	int a[100005];
	for(int i=1; i<=n; i++){
		cin>>a[i];
	}
	int q;
	cin>>q;
	while(q--){
		int x;
		cin>>x;
		int ans=0,flag=0;
		for(int i=n; i>=1; i--){
		    if(a[i]<x){
		        ans+=(x-a[i])/i;
		        x=a[i]+(x-a[i])%i;
		        if(x>a[i]){
		            x-=i;
		            ans++;
		        }
		    }
		    if(a[i]==x){
		        ans++;
		        flag=1;
		        break;
		    }
		}
		if(flag) cout<<ans<<"\n";
		else cout<<0<<'\n';
	}
	return 0;
}

T4

题面

在这里插入图片描述

思路

多重背包,加上二进制优化,就过了(糖丸了)。

代码

#include<bits/stdc++.h>
using namespace std;
#define int long long
int dp[120000];
signed main(){
	int a,b,c,d,e,f,cnt=1;
	while(cin>>a>>b>>c>>d>>e>>f){
		if(!a&&!b&&!c&&!d&&!e&&!f){
			break;
		}
		printf("Collection #%d:\n",cnt);
		cnt++;
		if((a+2*b+3*c+4*d+5*e+6*f)%2==1){
			cout<<"Can't be divided.\n\n";
		}
		else{
			int g[]={0,a,b,c,d,e,f};
			if(a+b+c+d+e+f==1){
				cout<<"Can't be divided.\n\n";
				continue;
			}
			dp[0]=1;
			int will=(a+2*b+3*c+4*d+5*e+6*f);
			for(int i=1; i<=6; i++){
				for(int k=1; k<=g[i]; k<<=1){
					for(int j=will;j>=i*k;j--){
			            dp[j]=dp[j]|dp[j-i*k];
			        }
			        g[i]-=k;
			    }
			    if(g[i]){
			        for(int j=will; j>=i*g[i]; j--) dp[j]=dp[j]|dp[j-i*g[i]];
			    }
			}
			if(dp[will>>1]) cout<<"Can be divided.\n\n";
			else cout<<"Can't be divided.\n\n";
			memset(dp,0,sizeof dp);
		}
	}
	return 0;
}

请关注作者的 B 站,谢谢~链接

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Programming_Konjac

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值