A
思路:
贪心,每次要么选两个最大的,要么选三个,因为一个数(除了1)都可以拆成2和3相加,直到所有的数都相同就停止,这时就可以得到答案了;
C:
二分+bfs,二分答案,然后bfs找出距离小于等于当前要判断距离的点,把这些点标记后,再遍历按价格排好序的商店,从小到大选择价格低的,
根据最后的数目和价格判断当前这个距离行不行,这样就可以得到答案了;
G:
思路:
模拟,先判断是否可以放在要求的地方,不行的话就从前往后找能放的地方,这里可以把前面的区间[l,r]的右端点r+1当做当前区间的左端点,然后判断区间是否相交
注意区间包含的情况;
H:
思路:
暴力,对于要求选的那些项,首先长度要相同,然后判断每一位上的字符,如果都相同,那么就取这个字符,否则取问号,得到了需要的字符串后再跟其他的字符串匹配下,
如果不能喝其他字符串匹配,那么就是符合要求的,否则就不是;
I:
思路:
最小费用最大流,这样建图:源点s到[1,n]这些点的容量为1,费用为0,[1,n]这些点到两个点fg,fp,容量为1,费用分别为-a[i],-b[i];
然后fg和fh分别到汇点t容量分别为g,h,费用为0,然后跑费用流的模板,跑完后再判断哪些点在哪个集合里就好了;这题还可以用dp搞,也可以学习一波;
J:
思路:
dp,dp[i][j][k]表示前i个中选中了j个作为最后的那些瓶子,这j个瓶子的容积和为k的最少时间;
转移的时候就是对于瓶子x,如果选它作为最后的瓶子,那么j和k就要加了,否则最少时间就要更新了;
代码地址: