随笔分类 - HDU
摘要:对满足条件的发票做一遍背包即可。 const int N = 3e6 + 10; int f[N]; int n; double m; void update(int v) { for(int j = m; j >= v; j--) f[j] = max(f[j], f[j - v] + v
阅读全文
摘要:线段树裸题。 单点修改+区间查询。 const int N=2e5+10; struct Node { int l,r; int maxv; }tr[N<<2]; int score[N]; int n,m; void pushup(int u) { tr[u].maxv=max(tr[lc].ma
阅读全文
摘要:将单词表中所有单词建立一棵字典树,再利用 数组统计字典树中以每个字母结尾的字符串的个数。因此,在接下来的多次询问中,只需要返回单词最后一个字母对应的数组值即可。 const int N=5e5+10; int trie[N][26],cnt[N],idx; void insert
阅读全文
摘要:注意细节。 const int N=1010; char s[N]; int n; int main() { while(~scanf("%s",s)) { n=strlen(s); vector<int> res; int num=0; bool have=false; for(int i=0;i
阅读全文
摘要:看到括号匹配当然想到栈了。 int main() { string s; while(cin>>s) { stack<char> stk; for(int i=0;i<s.size();i++) { if(s[i] == '(') stk.push(s[i]); else if(s[i] == ')
阅读全文
摘要:有向图判环。 拓扑排序 判断拓扑排序的结果是否包含个点。 const int N=110; vector<int> g[N]; int din[N]; int n,m; bool topo() { queue<int> q; for(int i=0;i<n;i++) if(din[i] ==
阅读全文
摘要:拓扑排序水题~。 const int N=510; vector<int> g[N]; vector<int> ans; int din[N]; int n,m; void topo() { priority_queue<int,vector<int>,greater<int>> q; for(in
阅读全文
摘要:题意 给定n个点和n*(n-1)/2条边的无向图,求图的最小生成树,其中有些边已经确定(可能是最小生成树的一部分,也可能不是)。 思路 由于已经确定了部分边,在读入数据过程中,如果这条边已经被确定,那我们就用并查集将两点合并;如果这条边还未确定,那么我们将它放进边集数组等待Kruskal算法进行从小
阅读全文
摘要:并查集裸题,注意的特判,此时没有朋友关系,房间里只能留下一个人,其余都要移出去。 const int N=1e7+10; int p[N]; int cnt[N]; int n,m; int find(int x) { if(x != p[x]) p[x]=find(p
阅读全文
摘要:本题求一个数包含49的个数,典型数位DP问题。 状态表示::当前为第len位,当前已统计的数字的状态为state。 其中,state有三种值: state == 1,表示上一位为4 state == 2,表示高位已存在49 state == 0,其他情
阅读全文
摘要:状态表示: dp[len][sta]表示当前第len位,上一位为last的情况下满足条件的数的个数。 int f[15][10]; int a[15]; int l,r; int dfs(int len,int last,bool limit) { if(!len) return 1; if(!li
阅读全文
摘要:题目给出的是中缀表达式,所以要计算它的值主要是两个步骤: 中缀表达式转后缀表达式。 计算后缀表达式。 下面分别讲一下这两步。 中缀表达式转后缀表达式 ①设立一个操作符栈,用以临时存放操作符;设立一个数组或者队列,用以存放后缀表达式。 ②从左至右扫描中缀表达式,如果碰到操作数(注意:操作数可能不止一位
阅读全文
摘要:哥德巴赫猜想,注意不要重复统计分解得到的素数对,即视为同一对。 const int N=35010; int primes[N],cnt; bool vis[N]; int n; void init(int n) { for(int i=2;i<=n;i++) if
阅读全文
摘要:求多个数的lcm,水题~ int n; int gcd(int a,int b) { return b?gcd(b,a%b):a; } int lcm(int a,int b) { return a/gcd(a,b)*b; } int main() { int T; cin>>T; while(T-
阅读全文
摘要:贪心基础题。 每种药水的体积是相同的,那么影响浓度的只能是每种药水的浓度,属于集装箱问题。 将药水浓度从小到大排列,然后依次相加求平均值,直到平均值大于所给浓度限制。 const int N=110; int a[N]; int n,v,w; int main() { int T; cin>>T;
阅读全文
摘要:贪心水题 ~ 。 按性价比从大到小排序即可。 const int N=1010; PDD a[N]; int n,m; bool cmp(PDD &a, PDD &b) { return a.fi/a.se > b.fi/b.se; } int main() { while(cin>>m>>n) {
阅读全文
摘要:状态表示:dp[i]是必须以A[i]结尾的连续序列。 那么只有两种情况: 这个最大和的连续序列只有一个元素,即以A[i]开始,以A[i]结尾。 这个最大和的连续序列有多个元素,即从前面某处A[p]开始(p<i),一直到A[i]结尾。 对第一种情况,最大和就是A[i]本身。 对第二种情况,最大和是dp
阅读全文
摘要:注意是要求最大化高度(运输量),而不是最小化路径长度。 于是二分高度,判断只走高度不超过的边的情况下,到达终点的最短距离。若不能抵达终点则返回false。 最后输出答案时要先check()出最优解再输出。 const int N=1010; struct Node { int v,h,c;
阅读全文