一、初赛错题解析
第一题
题目
解析
像素
位
字节
位
字节
故选B
第二题
题目
解析
送命题,不会就是不会。做不会只能感叹自己道行甚浅。B选项是代码托管仓库。
第三题
题目
解析
选A没啥好说的,记住就好,好奇怎么实现,请自行搜索。
拓展一个C++库函数nth_element( );
二、复赛错题解析
第一题
题目
题解
直接从 号点开始搜索,记一个
数组表示第
个点是否已经经过,并记一个
表示现在已
经经过了多少点,然后直接使用最暴力的回溯搜索即可。
存图可以考虑邻接矩阵或者邻接表,标程采用了邻接表,且注意每组数据要清空一下。
标程
#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();
}
}
第二题
题目
题解
我们设表示 除了自己之外的所有约数之和,那么可以视为,有
个物品,第
个物品重量
为 ,价值为
,背包容量为
,求最大价值之和。
那么先用一个暴力的循环求出 ,然后跑一遍 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;
}