ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

2022/7/15 CSP-S模拟题总结

2022-07-16 08:32:54  阅读:264  来源: 互联网

标签:ch 15 int 模拟题 read while freopen CSP getchar


题单贴贴

A.烽火传递

  • 其实就是一道单调队列优化 \(DP\),挂分是因为弹出队尾的条件 \(f[q[r]]>=f[i]\) 写成了 \(a[q[r]]>=a[i]\) (悲);
AC code
#include<bits/stdc++.h>
using namespace std;

inline int read(){
	int s=0,f=1;
	char ch=getchar();
	while(!isdigit(ch)){
		if(ch=='-') f=-1;
		ch=getchar();
	}
	while(isdigit(ch)){
		s=s*10+int(ch-'0');
		ch=getchar();
	}
	return s*f;
}

const int N=2e5+10;

int n,m;
int a[N];
int f[N],q[N];

int main(){
//	freopen("signal.in","r",stdin);
//	freopen("signal.out","w",stdout);
	n=read(),m=read();
	for(int i=1;i<=n;++i)
		a[i]=read();
	int l=1,r=1;
	for(int i=1;i<=n;++i){
		while(l<r && i-q[l]>m) ++l;
		f[i]=f[q[l]]+a[i];
//		if(i==1331) cerr<<q[l]<<endl;
		while(l<=r && f[i]<=f[q[r]])
			--r;
		q[++r]=i;
//		printf("%d %d\n",i,f[i]);
	}
	int ans=0x3f3f3f3f;
	for(int i=max(1,n-m+1);i<=n;++i)
		ans=min(ans,f[i]);
//	cerr<<ans<<endl;
	printf("%d",ans);
	return 0;
}
/*
5 3
1 2 5 6 2
*/

B.小R与回家

  • 最短路(然而考场上没有完全看出来甚至试图写费用流……)

C.疯狂的火神

  • 类似于一道背包,但要根据最优策略按照 \(b_i/c_i>=b_{i+1}/c_{i+1}\) 先排一遍序;

  • 状态设计 \(f_{i,j}\) 表示单挑到第 \(i\) 个人时(可能不单挑第 \(i\) 人)恰好用了 \(j\) 分钟的最大经验收益;

AC code
#include<bits/stdc++.h>
using namespace std;

inline int read(){
	int s=0,f=1;
	char ch=getchar();
	while(!isdigit(ch)){
		if(ch=='-') f=-1;
		ch=getchar();
	}
	while(isdigit(ch)){
		s=s*10+int(ch-'0');
		ch=getchar();
	}
	return s*f;
}

const int N=1e3+10;

#define ll long long

int T;
int n,t;
ll f[N][N<<2];

struct memr{
	int a,b,c;
	bool operator<(const memr &_){
		return (double)b/c>(double)_.b/_.c;
	}
}in[N];

int main(){
//	freopen("crazy.in","r",stdin);
//	freopen("crazy.out","w",stdout);
	T=read();
	while(T--){
		n=read(),t=read();
		for(int i=1;i<=n;++i){
			in[i].a=read(),in[i].b=read(),in[i].c=read();
		}
		sort(in+1,in+n+1);
		memset(f,0,sizeof(f));
		for(int i=1;i<=n;++i){
			for(int j=t;j;--j){
				if(j>=in[i].c)
					f[i][j]=max(f[i][j],f[i-1][j-in[i].c]+in[i].a-in[i].b*j);
				f[i][j]=max(f[i][j],f[i-1][j]);
			}
		}
		ll ans=0;
		for(int i=1;i<=t;++i)
			ans=max(ans,f[n][i]);
		printf("%lld\n",ans);
	}
	return 0;
}
/*
1
4 10
110 5 9
30 2 1
80 4 8
50 3 2

*/

D.火神的鱼

  • 火神你怎么那么多事

  • 线段树;

标签:ch,15,int,模拟题,read,while,freopen,CSP,getchar
来源: https://www.cnblogs.com/Star-LIcsAy/p/16483306.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有