集训Day 1

A题:

 B题:

 

刚开始看了眼T1觉得简单,就敲了一个暴力(get65)过了所有样例后就直奔T2,T2是拓扑排序的板子,但由于数据就只写了n^2算法(get100) 又过了所有样例,信心暴涨(当时想着能AK)但T1由于没写筛法,卒。giao~

t1其实很简单就是一个筛法模板(但我居然没看出来!)埃氏筛、欧拉筛均可(当然由于实力问题我……)最后总分165pt

 

 

TIPS:
1. 完全二叉树的叶子个数是 ceil(n/2.0),n表示节点个数
2. 表达式树的前中后序遍历就是前中后缀表达式
3. 用栈计算表达式:将数字放入栈中,碰到运算符取出两数字,并将结果重新放入(前缀倒着扫,后缀正着扫)
4. 田忌赛马:分别从自己的角度出发和从对手的角度出发考虑最优情况(另外要注意是否马匹数量相同)
5. 拼木棍问题:可以搜索,也可以动态规划,类似于「分硬币」,设 f(i, j, k, l) 表示前 i 根木棍,左边放的长度为 j,下面放的长度为 k,右边放的长度为 l 能否可行
6. 动态规划:可以我为人人,可以人人为我
7. 打表技巧:答案较少但会超时,直接本地跑出答案存到 const 数组
8. 优先队列是大根堆,如何改为小根堆?如何改为 pair?
9. 邻接表存图和拓扑排序模板

 

 

 

t1程序:

 

#include<bits/stdc++.h>
using namespace std;
const int N=1e7+5;
long long n,m,z[N];
int p(long long t)
{
    while(t)
    {
        if(z[t]==1) return 0;
        t/=10;
    }
    return 1;
}
int main()
{
    ios::sync_with_stdio(false);
    cin>>m>>n;
    z[1]=1;
    for(long long i=2;i<=n;i++)
    {
        if(z[i]==1) continue;
        else for(long long j=i*i;j<=n;j+=i) z[j]=1;
    }
    for(long long i=m;i<=n;i++) if(p(i)==1) printf("%lld\n",i);
    return 0;
}

 

t2程序:

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
long long n,m,w,a[N],b[N],d[N],ans=0;
vector<int > mp[N];
int main()
{
     freopen( "study.in", "r", stdin );
     freopen( "study.out", "w", stdout );
    ios::sync_with_stdio(false);
    cin>>n>>m>>w;
    for(int i=1;i<=n;i++) cin>>a[i];
    for(int i=1;i<=n;i++) cin>>b[i];
    for(int i=1;i<=m;i++)
    {
        int u,v;
        cin>>u>>v;
        d[v]++;
        mp[u].push_back(v);
    }
    while(1)
    {
        int cnt=0;
        for(int i=1;i<=n;i++)
        {
            if(d[i]==0&&a[i]<=w)
            {
                cnt++;
                w+=b[i];
                ans++;
                d[i]=-1;
                for(int j=0;j<mp[i].size();j++) d[mp[i][j]]--;
            }
        }
        if(cnt==0) break;
    }
    cout<<ans;
    return 0;
}

 

posted @ 2023-07-25 19:57  王浩泽  阅读(10)  评论(0编辑  收藏  举报