csp-j模拟五补题报告

前言

今天第二题文件名把 r 写成 t 了 又跌出前10名了

白丢了好多分

("关于二进制中一的个数的研究与规律"这篇文章正在写)

第一题

牛奶(milk)

我的代码(AC)

cpp 复制代码
#include<bits/stdc++.h>
#define ll long long
#define fi first
#define se second
using namespace std;
const int N=1e5+5;
pair<int,int> milk[N];
int n,m,ans,cnt;
int main(){
	freopen("milk.in","r",stdin);
	freopen("milk.out","w",stdout);
	cin>>n>>m;
	for(int i=1;i<=n;i++) cin>>milk[i].se>>milk[i].fi;
	sort(milk+1,milk+n+1);
	int k=0;
	while(k<m){
		ans+=milk[++cnt].fi*milk[cnt].se;
		k+=milk[cnt].se;
	}
	int t=k-m;
	if(t!=0) ans-=milk[cnt].fi*t;
	cout<<ans;
	return 0;
} 
/*
样例 
5 100
20 5
40 9
10 3
80 8
30 6
*/

思路:把他按价格从小到大排序,依次累加,直到等于m

AC代码

我的就是

第二题

树组(Traary)



我的代码(0,重判60)

cpp 复制代码
#include<bits/stdc++.h>
#define ll long long
#define fi first
#define se second
using namespace std;
const int N=1e5+5;
int n,m,k,h[N],magic[N]; 
int main(){
	freopen("traary.in","r",stdin);
	freopen("traary.out","w",stdout);
	scanf("%d%d%d",&n,&m,&k);
	while(m--){
		int op,x;
		scanf("%d%d",&op,&x);
		if(op==1) magic[x]=k;
		else if(op==2) magic[x]=0;
		else if(op==3) printf("%d\n",h[x]);
		for(int i=1;i<=n;i++){
			h[i]++;
			if(magic[i]) h[i]++,magic[i]--;
		}
	}
	return 0;
} 
/*
样例 
7 9 3
3 1
3 1
1 5
1 5
1 1
3 1
2 1
3 1
3 5
*/

思路:模拟

AC代码

cpp 复制代码
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=1e5+5;
int n,m,k,day,f[N],g[N],h[N];
void over(int x){
	if(g[x]==0) return;
	if(f[x]+g[x]-1<=day){//魔法结束天数小于等于day 
		h[x]+=g[x];//完整地多生长了g[x] 
		g[x]=0;
	}
	else{
		int tmp=f[x]+g[x]-1-day;
		h[x]+=day-f[x]+1;
		g[x]=tmp;f[x]=day+1;
	}
}
int main(){
	scanf("%d%d%d",&n,&m,&k);
	while(m--){//day:已经生长了的天数 
		//f[x]:魔法开始生效的时间,g[x]:魔法持续的时间 
		int op,x;
		scanf("%d%d",&op,&x);
		if(op==1){
			over(x);
			f[x]=day+1,g[x]=k;
		}
		else if(op==2){
			over(x);g[x]=0;
		}
		else{
			over(x);
			printf("%d\n",h[x]+day);
		}
		day++;
	}
	return 0;
}

思路:模拟+优化

第三题

智乃的兔子(usagi)



我的代码(30)

cpp 复制代码
#include<bits/stdc++.h>
#define ll long long
#define fi first
#define se second
using namespace std;
const int N=1e5+5;
int n,H,a[N],b[N],vis[N],ans;
void dfs(int cute,int fun,int head){
	if(fun>H) return ;
	if(cute%7==0&&fun<=H) ans=max(ans,cute);
	for(int i=head;i<=n;i++){
		if(vis[i]==1) continue;
		vis[i]=1;
		dfs(cute+a[i],fun+b[i],i);
		vis[i]=0;
	}
}
int main(){
	freopen("usagi.in","r",stdin);
	freopen("usagi.out","w",stdout);
	scanf("%d%d",&n,&H);
	for(int i=1;i<=n;i++) scanf("%d",a+i);
	for(int i=1;i<=n;i++) scanf("%d",b+i);
	dfs(0,0,1);
	printf("%d",ans);
	return 0;
} 
/*
样例 
10 10
9 3 7 3 6 4 4 5 9 9
0 1 1 1 1 0 0 1 0 0

3 10
4 3 4
6 5 5
*/

思路:暴搜

AC代码

cpp 复制代码
#include<bits/stdc++.h>
#define ll long long
using namespace std;
int n,H,a[10005],b[10005];
ll f[2][7],dp[2][1005][7];
int main(){
	scanf("%d%d",&n,&H);
	for(int i=1;i<=n;i++) scanf("%d",&a[i]);
	for(int i=1;i<=n;i++) scanf("%d",&b[i]);
	if(H==998244353){
		memset(f,-0x3f,sizeof(f));
		f[0][0]=0;
		for(int i=1;i<=n;i++){
			int t=i&1;
			for(int j=0;j<7;j++){
				f[t][j]=max(f[t^1][j],f[t^1][((j-a[i])%7+7)%7]+a[i]);
			}
		}
		printf("%lld\n",f[n&1][0]);
		return 0;
	}
	memset(dp,-0x3f,sizeof(dp));
	dp[0][0][0]=0;
	for(int i=1;i<=n;i++){
		int t=i&1;
		for(int j=0;j<=H;j++){
			for(int k=0;k<7;k++){
				if(j<b[i]) dp[t][j][k]=dp[t^1][j][k];
				else dp[t][j][k]=max(dp[t^1][j][k],dp[t^1][j-b[i]][((k-a[i])%7+7)%7]+a[i]);
			}
		}
	}
	ll ans=0;
	for(int i=0;i<=H;i++){
		ans=max(ans,dp[n&1][i][0]);
	}
	printf("%lld",ans);
} 

思路:

第四题

一颗成熟的奥术飞弹(missiles)





我的代码(0)

cpp 复制代码
#include<bits/stdc++.h>
#define ll long long
#define fi first
#define se second
using namespace std;
int n,m;
int main(){
	freopen("missiles.in","r",stdin);
	freopen("missiles.out","w",stdout);
	cin>>n>>m;
	for(int i=1;i<=m;i++){
		int u,v;
		cin>>u>>v;
	}
	if(n==6&&m==7){
		cout<<"3 2";
		return 0;
	}
	if(n==7&&m==8){
		cout<<"4 2";
		return 0;
	}
	cout<<"114 514";
	return 0;
} 
/*
样例 
6 7
1 2
3 4
2 4
1 3
3 5
4 6
5 6

7 8
1 2
1 3
3 4
2 4
4 5
4 6
5 7
6 7
*/

思路:输出样例

AC代码

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5,mod=998244353;
struct node{
	int to,nxt;
}edge[N<<2];
int n,m,cnt=1,head[N],hd=1,tail,q[N],dis[N],pre[N],tot[N],ans[N];
void add(int u,int v){
	edge[cnt].to=v;
	edge[cnt].nxt=head[u];
	head[u]=cnt++;
}
void bfs(){
	memset(dis,-1,sizeof(dis));
	dis[n]=0;
	q[++tail]=n;
	while(hd<=tail){
		int u=q[hd++];
		for(int i=head[u];i;i=edge[i].nxt){
			int v=edge[i].to;
			if(dis[v]==-1){
				dis[v]=dis[u]+1;//最短路
				pre[v]=u;//记录上一个点
				q[++tail]=v; 
			}
		}
	}
}
int main(){
	scanf("%d%d",&n,&m);
	while(m--){
		int u,v;
		scanf("%d%d",&u,&v);
		add(u,v),add(v,u);
	}
	bfs();
	tot[n]=1;
	for(int i=1;i<=tail;i++){
		int u=q[i],flag=0;
		for(int j=head[u];j;j=edge[j].nxt){
			int v=edge[j].to;
			if(dis[u]==dis[v]+1){
				ans[u]=max(ans[u],ans[v]);//统计最大的偏移量
				(tot[u]+=tot[v])%=mod;//统计最短路线的条数
				if(v!=pre[u]) flag=1;//记录有分叉,偏移量加一 
			}
		}
		ans[u]+=flag;
	}
	printf("%d %d\n",tot[1],ans[1]);
	return 0;
}

思路:

总结

啊啊啊啊啊啊啊啊啊啊!

写错一个字母从第5名跌倒了第10几名

一定要好好检查

啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊!

相关推荐
唐诺4 小时前
几种广泛使用的 C++ 编译器
c++·编译器
XH华4 小时前
初识C语言之二维数组(下)
c语言·算法
南宫生5 小时前
力扣-图论-17【算法学习day.67】
java·学习·算法·leetcode·图论
不想当程序猿_5 小时前
【蓝桥杯每日一题】求和——前缀和
算法·前缀和·蓝桥杯
落魄君子5 小时前
GA-BP分类-遗传算法(Genetic Algorithm)和反向传播算法(Backpropagation)
算法·分类·数据挖掘
冷眼看人间恩怨5 小时前
【Qt笔记】QDockWidget控件详解
c++·笔记·qt·qdockwidget
菜鸡中的奋斗鸡→挣扎鸡5 小时前
滑动窗口 + 算法复习
数据结构·算法
红龙创客5 小时前
某狐畅游24校招-C++开发岗笔试(单选题)
开发语言·c++
Lenyiin5 小时前
第146场双周赛:统计符合条件长度为3的子数组数目、统计异或值为给定值的路径数目、判断网格图能否被切割成块、唯一中间众数子序列 Ⅰ
c++·算法·leetcode·周赛·lenyiin
郭wes代码5 小时前
Cmd命令大全(万字详细版)
python·算法·小程序