摘要:
只能操作长度不超过$n$的区间。 对$1$和$n$所在的位置进行讨论: 若数组已经有序,则答案为$0$ 若$a[1]=1$,只需选择$[2,n]$进行一次重排即可。同理,若$a[n]=n$,只需选择$[1,n-1]$进行一次重排即可。 若$a[1]=n$且$a[n]=1$,则首先选择$[1,n-1] 阅读全文
摘要:
首先将数组$a$从小到大排序。 \[ |a_1-x|+|a_2-x|+\cdots+|a_n-x| \ge|a_n-a_1|+|a_{n-1}-a_2|+\cdots +|a_{n/2+1}-a_{n/2}| \] 当$x$位于$a_n$和$a_1$之间时,\(|a_1-x|+|a_n-x| \ge 阅读全文
摘要:
状态表示: \(f(i,a,b,c,d)\):到达第$i$个格子,所用卡片$1$数量为$a$张,卡片$2$数量为$b$张,卡片$3$数量为$c$张,卡片$4$数量为$d$张时能够获得的分数最大值。 状态转移: \[ f(i,a,b,c,d)=\max \begin{cases} f(i-1,a-1, 阅读全文
摘要:
先考虑没有娇姐发功怎么做。 考虑每只糖糖最后能不能存活:第$i$只糖糖能存活的条件是他后面没有比他大的另外一组的糖糖,所以我们只需要从后往前扫描维护当前位置往后每一组糖糖的最大值是多少然后和当前糖糖的能力值比较就行。 现在再来考虑娇姐发功的问题。 娇姐会在第$c_i$秒使得前$c_i$个人的能力值+ 阅读全文
摘要:
思路 通过对样例的模拟,发现答案为相邻两个蓝色石子中间最多的红色石子的数量。 双指针做法: const int N=1e5+10; int a[N],b[N]; int n,m; int main() { int T; cin>>T; while(T--) { cin>>n>>m; for(int 阅读全文
摘要:
$b[i]$表示第$i$个行第一列是否有雷,即$b[i]$的值只能为$0$或$1$。 一旦第$i-1$行第一列的摆放情况确定,因为要满足$8$连通的格子里的数字限制,第$i$行第一列的摆放情况也随之确定。 递推式: \[ b[i] = a[i-1] - b[i-1] - b[i-2] \] $a[i 阅读全文
摘要:
首先将所有点按纵坐标从小到大排序,纵坐标相同的按横坐标从小到大排序,这样一来,每个点+x方向上最近的点(若存在)在排序后的数组宏一定相邻。 DFS搜索与当前点匹配的点,若当前点已经配对,则搜下一个点;若没有配对,则寻找还没有配对的点与当前点配对。 之后分别以每个点为起点进行DFS判环(每次判环前需要 阅读全文
摘要:
贪心。 经典问题。 注意点 不要忘记最后一个区间对最长连续挤奶时间区间的更新。 const int N=5010; PII a[N]; int n; int main() { cin>>n; for(int i=0;i<n;i++) cin>>a[i].fi>>a[i].se; sort(a,a+n 阅读全文
摘要:
按天数模拟。 const int N=110; int month[2][13]={ {0,31,28,31,30,31,30,31,31,30,31,30,31}, {0,31,29,31,30,31,30,31,31,30,31,30,31} }; int cnt[7]; int n; bool 阅读全文
摘要:
首先破环成链。 之后枚举$n$处断裂的位置,对于每次断裂形成的一串项链,采用双指针分别统计左边颜色连续的珍珠串长度和右边颜色连续的珍珠串长度。 const int N=355; char s[N<<1]; int n; int main() { cin>>n; scanf("%s",s); for( 阅读全文