ZJNU 1365 - Window--中级】的更多相关文章

每次都寻找长度为k的区间内的最小值显然很容易超出时间限制 所以可以把窗户看作一个数量固定的队列 每次观察入列与出列的元素对答案贡献如何,以更新答案 /* Written By StelaYuri */ #include<stdio.h> ],max[]; int gmax(int i,int k) { int j,m=tmp[i]; ;j>i-k;j--) if(m<tmp[j]) m=tmp[j]; return m; } int gmin(int i,int k) { int…
打表处理(否则Case 1超时) 对m进行枚举,每次枚举进行一次判断 因为好人坏人均为k个,那么只要让下一个死亡的人的位置p保证在1~剩余坏人数量之间即可,不满足则直接break枚举下一个m 实际上对于m,因为m必须是 [2kC+1,2kC+k] C∈N+ 之间的数,所以还能再优化,但下面的代码已经能够在78ms左右过题,故可以忽略 /* Written By. StelaYuri */ #include<stdio.h> int main(){ ],k,m,p,d; ;k<;k++){…
可以将相同的人数分块存在数组gp中先 例如RRGGGRBBBBRR 则gp[1~5]={2,3,1,4,2} 首先可以知道,如果要让没有相邻的相同,只需要每个gp[i]/2向下取整即可得出最少需要改变的个数 例如RGGGR,只看G,只需要改变中间的G即可 例如RGGGGR,只看G,可以选择改变1和3或者2和4位置的G. 最后,考虑首尾成环对答案的影响 例如RRRGRRR gp[1~3]={3,1,3} 则由上面的说法可以得到答案为3/2+1/2+3/2=1+0+1=2人 但实际上首尾连接后有6个…
1.如果一个单元为0,表示没做过这题,不计入成绩 2.如果一个单位为负数,表示做错了这题,不计入成绩 所以只要一个单元为正数(不论是否有括号)都说明做出了这一题,计入成绩 将名字和成绩都当作字符串读入,方便处理含有括号的情况 字符串读入后检查末尾是否为')'即可分开判断有无括号的情况(如果有括号,成绩一定存在) 为了方便可以用 结构体/自定义函数/排序自定义compare函数 来实现 当然,不使用结构体可以用普通数组代替 不使用algorithm库的sort可以用冒泡选择这两种基本排序做(不会存…
取模判断,数组模拟 /* Written By StelaYuri */ #include<stdio.h> ]; int main(){ int n,m,i,s,t; ;i<;i++){ a[i]=; t=i; ){ ==||t%==){ a[i]=; break; } t/=; } } while(scanf("%d%d",&n,&m)!=EOF&&(n||m)){ s=; for(i=n;i<=m;i++) if(a[i])…
处理后再判断即可,处理过程注意考虑全面. /* Written By. StelaYuri */ #include<iostream> #include<string> using namespace std; ]; void shape(int n){ ,len=s[n].length(),p=; ]=='-') p=; ;i<len;i++) if(s[n][i]=='.'){ pj=; break; } if(pj){ ]==') s[n].erase(--len,);…
栈运用的模板题,对于符号进行出入栈操作,每次与栈顶的符号进行优先级判断,得出第一行后缀表达式. 在其后的化简计算中,每次用一个特殊符号(代码中使用了'?')代替原来的计算结果引用,并开一个数组表示每次的计算结果,之后搜索到'?'时用这个结果进行代入计算. 直到只剩下一个数字,停止程序. /* Written By. StelaYuri */ #include<iostream> #include<cstring> #include<cmath> #include<…
状态转移b[i]记录价值为i的单词种类数d[j+k*i]+=b[j] , k<=a[i]&&j+k*i<=50表示价值为j+k*i的单词可以由价值为j的单词加上k个i字母转移而来最后统计即可 /* Written By. StelaYuri */ #include<stdio.h> int main(){ ]={},b[],d[],s; scanf("%d",&T); ;t<T;t++){ ;i<;i++) scanf(&qu…
二维图的动态规划因为不能穿越对角线,则选取对角线的一边dp即可选取对角线右下侧则x轴上每个点只能由其左侧的点走过去(只有1条)对角线上的点只能由对角线下方的点走过去其他点可以由左侧和下侧两种方式到达因为对角线左上和右下均可所以答案*2 /* Written By. StelaYuri */ #include<stdio.h> ][]; int main(){ ; ;i<=;i++){ s[i][]=; ;j<i;j++) s[i][j]=s[i][j-]+s[i-][j]; s[i…
推出n=1到4时,An排列的种类数分别为1 4 15 64可得(1+1)*2=4(4+1)*3=15(15+1)*4=64...故用一数列r[n]记录An的种类总数当n=3时,列举出以下15种从大到小的排列11 21 2 31 31 3 222 12 1 32 32 3 133 13 1 23 23 2 1可得开头为1,2,3时分别由5种排列,并且这5种内都有一种是这个数自身可得r[n]/n-1=r[n-1],又得出上面的递推公式所以定义一个数组rd[n]=r[n]/nrd[n]则表示开头相同时…