摘要:
贪心加优先队列 (默认是小的在前,正好) //这里又很套路,设队列里的都是符合条件的考虑新加入的即可。再处理一下空队列的情况。很完美// 截止时间短的在前面,干的就多先根据截止日期排序优先队列根据完成所需时间排序首先队列里的都是能完成的策略:新加入的,如果在前面的完成后仍能完成,就直接加进去;不能, 阅读全文
摘要:
画图,每个给出点都有对应区间;先sort,再尽量靠右选;很常见的套路了..//注意不要越界(0,L) struct Q //复习结构{ double l,r; Q(double _l,double _r):l(_l),r(_r){} bool operator < (const Q &a) cons 阅读全文
摘要:
贪心部分的理论依据:前i个数可以凑出1~sum[i]的所有整数。 证明:第二类数学归纳,n=1时成立,假设n=k之前所有项都成立,当n=k+1时。sum[k+1]=sum[k]+a[k+1]。只需证明能凑出sum[k]+1~sum[k+1]间的整数即可。设1≤p≤a[k+1],sum[k]+p=su 阅读全文
摘要:
题目要求k>=最大度数;观察,颜色数量和度数的关系,得颜色数=最大度数+1(偶数)//最大度数(奇数) 可以满足染色关系一个点和周围的点的颜色数加起来最大为它的度数+1; k=所有点中最大的度。如果最大入度是偶数,则k+1。证明:当最大度数为奇数n,设点u所连n个点,点u为1,n-1个点不一样,1个 阅读全文
摘要:
和cf的打分有点像啊 因为一共只有三道题,所以每个人的得分最多有8种可能性。把这8种可能性都算出来,存在数组里,排好序备用排名就是一个天然的链表,给出了扫描的顺序扫描时,维护两个变量:前一个player的最大得分 recd 和他的ID recdID扫描到每个player时,从大到小遍历他的8种得分, 阅读全文
摘要:
逆序做,逆序输出 紫书上的描述有点问题 感觉很经典 ans.push_back(2); a.insert(a.begin(),a[n-1]); a.erase(a.end()-1); a.push_back(k);vector 的操作 没有证明这样做的复杂度要求... 阅读全文
摘要:
类似煎饼,先把1放到1,之后是子问题 (先放到前一半,再放到开头,两次操作)(任何位置,最多一次就可以放到前一半)) 阅读全文
摘要:
首先根据题意,既然0能变1,问号能变任何。那么不能变成T串的情况只能是S串中的1大于T串中1的个数。 然后考虑能够成为T串的情况。首先,不相同的0和不相同的1首先进行置换,因为这样置换只需进行一次操作,比其它任何情况都优。交换次数为diff0 diff1中小的那个次,之后借由?再有2*(diff0 阅读全文
摘要:
细节值得注意 注意vector<string>是可以直接sort的! 阅读全文
摘要:
连通器向左向右扫描两次即可每一段有水的连通区域,高度必须相同,且不超过最低天花板高度if(p[i] > level) level = p[i]; 被隔断,要上升(隔断后,之前的就不变了,之后的从p【i】开始) if(s[i] < level) level = s[i]; h[i] = level;左 阅读全文