集训Day 4

 

比赛开始,先看了一眼A题,great!这个数据写一个DFS就可以过100%于是就开始写DFS但是一直爆,数组也没越界,也没开太大,我就十分奇怪,于是就这样调了大约十来分钟发现是因为遍历器的问题(我已经因为遍历器炸了2次了,再也不用遍历器了Q w Q)将遍历器换成正常的for循环就过了(get100pt)。然后看了第二题,em……没有思路,为了保分只能硬着头皮写了两个打表的程序,但是,第二个打表的程序没写好,导致直接浪费了30分钟。(哭)最后一会我就写了一个DFS充数。(get40pt)。总分140

 

TIPS:
1. 对自己高要求:禁止考试有任意一道题目爆零!都要写暴力!
2. 检查文件名、freopen、多组数据清空、输出换行等sb错误
3. 搜索回溯是对称的
4. 搜索的两种模式:一种是到该点时,该点信息已经处理完毕;一种是到该点时先处理该点信息再搜索。无论 DFS 还是 BFS 均符合,如果思路杂交会非常混乱。
5. 三行 01 背包代码要吃透并且熟练。
6. 得到所有数的约数之和的另类写法:考虑将 i 贡献到 i 的倍数上,相较于直接暴力的 O(n 根号 n),这个做法是 O(n log n) 的
7. 初赛强度取决于省份,现在初赛要求较高,一定认真对待初赛!!!!
8. 分辨率的 4096*2160 指的是像素,一个像素可能是 3224 位等
9. STL <algorithm> 库中有 nth_element 函数,可以在 O(n) 时间内求出一个序列的第 k 大的数字
10. 存储二叉树一般是左儿子是自己下标乘二,右儿子是自己下标*2+1
11. A 班 5 风纪委员,B 班 4,C 班 3,要出六名委员,问方案数(只关心每个班出的人数),考虑出的人数长什么样(6 0 0, 5 1 0, 4 2 0, 3 3 0)等
12. 排序的稳定性:比较关键字时,若关键字相同,不能改变他们的相对顺序就叫稳定
13. 生成 [a, b) 的数字:
14. memset(a, -1/255/0x3F/0, sizeof(a)) 分别什么意思?
15. 对于杨辉三角和组合数的敏感度?

 

 

 

B题题解:

这道题是一道01背包(灵异背包),板子部分不再赘述,按照题意将题目转化为 背包容量为S现要求塞入若干个数,每个数的所占空间为其本身大小,装完后要求背包中所有数的最大公约数最大,问最大多少?简单了?

 A题程序:

#include<bits/stdc++.h>
using namespace std;
//const int N=1e3;
int n,m,vis[11451],ans=0;
vector<int> mp[19198];
void dfs(int k,int step)
{
    if(step==n) ans++;
    else
    {
        for(int i=0;i<mp[k].size();i++)
        {
            if(vis[mp[k][i]]==0)
            {
                vis[mp[k][i]]=1;
                dfs(mp[k][i],step+1);
                vis[mp[k][i]]=0;
            }
        }
    }
}
int main()
{
    freopen( "hami.in", "r", stdin );
     freopen( "hami.out", "w", stdout );
    ios::sync_with_stdio(false);
    int t;
    cin>>t;
    while(t--)
    {
        ans=0;
        cin>>n>>m;
        for(int i=1;i<=n;i++) mp[i].clear();
        for(int i=1;i<=m;i++)
        {
            int u,v;
            cin>>u>>v;
            mp[u].push_back(v);
            mp[v].push_back(u);
        }
        for(int i=1;i<=n;i++) vis[i]=0;
        vis[1]=1;
        dfs(1,1);
        printf("%d\n",ans);
    }
    return 0;
}

 

B题程序:

#include<bits/stdc++.h>
using namespace std;
const int N=1e3+5;
int S,sum[N],f[N];
int main()
{
    ios::sync_with_stdio(false);
    cin>>S;
    for(int i=1;i<=S;i++) for(int j=2;i*j<=S;j++) sum[i*j]+=i;
    for(int i=1;i<=S;i++) for(int j=S;j>=1;j--) f[j]=max(f[j],f[j-i]+sum[i]);
    int maxn=-100;
    for(int i=1;i<=S;i++) maxn=max(maxn,f[i]);
    cout<<maxn;
    return 0;
}

 

posted @ 2023-07-27 20:13  王浩泽  阅读(10)  评论(0编辑  收藏  举报