集训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; }