7.27 总结+复盘

一、初赛错题解析

第一题

题目

解析

\because1像素=24位        1字节=8位​​​​​​​        1 MB=1024\times 1024字节 

\therefore\frac{4096\times2160\times24}{8\times1024\times1024}\approx 25MB

故选B

第二题

题目

解析

送命题,不会就是不会。做不会只能感叹自己道行甚浅。B选项是代码托管仓库。

第三题

题目

解析

选A没啥好说的,记住就好,好奇怎么实现,请自行搜索。 

拓展一个C++库函数nth_element(        );

二、复赛错题解析

第一题

题目

 

题解

直接从 1 号点开始搜索,记一个 vis 数组表示第i个点是否已经经过,并记一个 cnt 表示现在已
经经过了多少点,然后直接使用最暴力的回溯搜索即可。
存图可以考虑邻接矩阵或者邻接表,标程采用了邻接表,且注意每组数据要清空一下。

标程

#include<bits/stdc++.h>
using namespace std;
const int maxN=15;
int n,m,t,ans,cnt;//cnt表示经过的节点数 ,ans表示方案 
bool vis[maxN];//true表示该点被经过了,false表示没被经过 
vector<int> adj[maxN]; //邻接表数组 
void DFS(int u){
	vis[u]=true;//第u节点被经过了 
	cnt++;//经过的节点数加一 
	if(cnt==n)//到达终点答案+1 
		ans++;
	for(int v:adj[u]){
		if(!vis[v]){//到该节点如果有没经过的路继续搜素 
			DFS(v);	
		}
	}
	//↓回溯 
	vis[u]=false; 
	cnt--;
}
int main(){
	cin>>t;
	while(t--){
		cin>>n>>m;
		for(int i=1;i<=m;i++){
			int u,v;
			cin>>u>>v;
			adj[u].push_back(v);//邻接表存图 
			adj[v].push_back(u);
		}
		DFS(1);
		cout<<ans<<endl;
		ans=0;
		for(int i=1;i<=n;i++)//千万别忘清空!不然直接寄! 
			adj[i].clear();
	}
}	

第二题

题目

题解

我们设f(i)表示 除了自己之外的所有约数之和,那么可以视为,有S个物品,第i个物品重量
i,价值为 f(i),背包容量为 S,求最大价值之和。
那么先用一个暴力的循环求出 f(i) ,然后跑一遍 01 背包即可。

标程

#include <iostream>
using namespace std;
const int maxN = 1e3 + 5;
int S;
int sum[maxN];
int f[maxN];
int main()
{
	cin >> S;
	for (int i = 1; i <= S; ++i)
		for (int j = 2; i * j <= S; ++j)
			sum[i * j] += i;//存储i所有约数的和 
	for (int i = 1; i <= S; ++i)//01背包模板 
		for (int j = S; j >= i; --j)
			f[j] = max(f[j], f[j - i] + sum[i]);// 状态转移 
	int ans = 0;
	for (int i = 1; i <= S; ++i)
		ans = max(ans, f[i]);//跑出f数组的最大值 
	cout << ans << endl;
	return 0;
}

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值