sum

杭电oj1003题

丶灬走出姿态 提交于 2020-02-28 00:52:07
这一题是让求和最大的子序列。 这一题我的大概思路是:1.把每一行数据用一个数组存放,即a[0]存放的是数的个数N,设sum为当前和,z为当前序列的开始下标;sum存放最大值(初始值设为-1001),r,p为取最大值子序列的开始和结束下标。 2.每读取一个数组值,就用sum加上它,然后跟max比较,如果sum更大,就更新max和p; 3.这题的关键点我认为是要理解这里:如果sum>=0,sum+a[i]<0,则将sum归零,并z=i+1,也就是将当前的子序列舍去。因为:假设sum+a[i]=-2,a[i+1]=7,则sum+a[i]+a[i+1]=5<7. 下边是ac的代码: #include<stdio.h> int main(){ int n; scanf("%d",&n); int q=0; while(n--){ q++; int a[100002]; int i=0; scanf("%d",&a[0]); //a[0]存放数据的个数 for(i=1;i<=a[0];i++){ scanf("%d",&a[i]); } int m=-1001,s=0,z=1,r,p; //最大值,当前子序列的和,当前子序列的初始下标,取最大值的子序列的初始下标和结束下标 for(i=1;i<=a[0];i++){ s+=a[i]; if(s>m){ //出现更大值 r=z; m=s; p=i

树状数组-蓝桥杯省赛C++B组-小朋友排队

寵の児 提交于 2020-02-27 23:53:32
树状数组-蓝桥杯省赛C++B组-小朋友排队 题目: n 个小朋友站成一排。 现在要把他们按身高从低到高的顺序排列,但是每次只能交换位置相邻的两个小朋友。 每个小朋友都有一个不高兴的程度。 开始的时候,所有小朋友的不高兴程度都是 0。 如果某个小朋友第一次被要求交换,则他的不高兴程度增加 1,如果第二次要求他交换,则他的不高兴程度增加 2(即不高兴程度为 3),依次类推。当要求某个小朋友第 k 次交换时,他的不高兴程度增加 k。 请问,要让所有小朋友按从低到高排队,他们的不高兴程度之和最小是多少。 如果有两个小朋友身高一样,则他们谁站在谁前面是没有关系的。 输入格式 输入的第一行包含一个整数 n,表示小朋友的个数。 第二行包含 n 个整数 H1,H2,…,Hn,分别表示每个小朋友的身高。 输出格式 输出一行,包含一个整数,表示小朋友的不高兴程度和的最小值。 数据范围 1≤n≤100000, 0≤Hi≤1000000 输入样例: 3 3 2 1 输出样例: 9 样例解释 首先交换身高为3和2的小朋友,再交换身高为3和1的小朋友,再交换身高为2和1的小朋友,每个小朋友的不高兴程度都是3,总和为9。 题解: 过 程 类 似 于 冒 泡 排 序 , 对 于 n 个 无 序 数 , 通 过 相 邻 两 项 交 换 得 到 有 序 序 列 , 每 一 个 数 h [ i ] 需 要 交 换 的

排列组合

二次信任 提交于 2020-02-27 18:55:16
定义 给定 n n n 个球,从中取出 m m m 个来 ( m ≤ n ) (m \leq n) ( m ≤ n ) ,共有多少种取法? 若考虑取出的顺序,也就是说取 1 , 2 1,2 1 , 2 与 2 , 1 2,1 2 , 1 相同,则是 C C C 若不考虑取出的顺序,则是 A A A 公式 C n m = n ! m ! ( n − m ) ! C^m_n=\frac{n!}{m!(n-m)!} C n m ​ = m ! ( n − m ) ! n ! ​ A n m = n ! ( n − m ) ! A^m_n=\frac{n!}{(n-m)!} A n m ​ = ( n − m ) ! n ! ​ C n m × A m m = n ! m ! ( n − m ) ! × m ! = n ! ( n − m ) ! = A n m C^m_n \times A^m_m =\frac{n!}{m!(n-m)!} \times m! =\frac{n!}{(n-m)!}=A^m_n C n m ​ × A m m ​ = m ! ( n − m ) ! n ! ​ × m ! = ( n − m ) ! n ! ​ = A n m ​ C n m + 1 = n ! ( m + 1 ) ! ( n − m − 1 ) ! C^{m+1}_n=\frac{n!}{

箭头函数

大城市里の小女人 提交于 2020-02-27 09:10:04
es6允许使用"箭头"(=>)定义函数。 1.根据参数的不同分几种情况:   ()=>  //没有参数的时候   x=>  //只有一个参数的时候   (x,y)=>  //有多个参数的时候 2.大括号{}被解释为代码块,如果箭头函数的代码块部分多于一条语句,就要使用{}将他们阔起来,用return语句返回。 var add = (num1,num2)=>{ var sum; if(num1 ==15){ sum = num1 +num2; } else{ sum = 20; } return sum; } console.log(add(15,15)); //30 当然,=>后面也不一定非得接return之后的语句 $("#btn-ok").on("click",()=>{ bindEvent(); fn(); }); function bindEvent() { /***绑定onbeforeunload事件****/ window.onbeforeunload = function() { return "确定离开页面吗?"; } } function fn() { console.log("yes"); } 注意:多行语句要用{}括起来,单行语句不用,并且会作为函数的返回值。 var sum = (num1,num2) =>num1+num2; console.log(sum

Python笔记【二】

妖精的绣舞 提交于 2020-02-27 04:21:35
之前分享过一次我在学习Python的笔记, Python笔记【一】 ,最近有些新的收获,分享一下; random.sample() 随机不重复的数 工作中,有时候是需要在数据库手动去造些数据的,有些字段类似 order_id ,一般都是不重复的(在不考虑有退款等其他异常的情况下),若要造超多数量、不重复的order_id,该如何来做? 推荐使用random.sample(); 实际 在遇到生成随机整数的时候,我第一反应就是random.randint(),我们对比下: 循环random.randint(),实际会重复,而random.sample() 不会重复,具体原因:源码中注释 字符串find() != -1 find() 检测字符串中是否包含子字符串 sub,如果指定 start 和 end 范围,则在指定范围内 检查是否包含,如果包含子字符串 返回子字符串的索引值,否则返回-1。 这儿主要是想说下 :Return -1 on failure 因为 我往往不能确定子字符串的index,反而使用 str_xx.find('xxxx) != -1 会更多。 字符串开头、结尾 startswith() \endwith() 有时候确定 某字符串是否以某子字符串为开头、结尾,就要用到startswith()、 endswith(); 这儿要说的是上面2图 鼠标所在那行 prefix

线段树入门

拈花ヽ惹草 提交于 2020-02-26 22:19:59
线段树入门 引题 有一个包含 N N N 个数的序列( N ≤ 1 e 6 N \leq 1e6 N ≤ 1 e 6 ),给 Q ( ≤ 1 e 6 ) Q(\le 1e6) Q ( ≤ 1 e 6 ) 个操作,每个操作是下面两种中的一种: 区间加:给定 l , r , x l,r,x l , r , x ,将序列 N N N 下标 ∈ [ l , r ] \in [l, r] ∈ [ l , r ] 的数加上 x x x 区间求和:给定 l , r l,r l , r ,询问下标 ∈ [ l , r ] \in [l,r] ∈ [ l , r ] 的数的和 一种很暴力的想法是对每个操作都一遍循环进行修改、求和,显然会超时;看到区间求和很容易就能想到前缀和,这样可以把区间求和降到常数复杂度,然而区间加还是 O ( N ) O(N) O ( N ) ;这时就需要线段树登场了 介绍 线段树是一种实用的数据结构,它可以快速地处理区间操作,维护区间信息。线段树是一棵二叉树,它的每一个节点存储的是一个区间的信息(如区间和, 左右端点等),如下图所示 笔者个人比较习惯用结构体来定义每一个节点,如果只开 2 N 2N 2 N 个节点,有一些情况是不够的,索性开到 4 N 4N 4 N ,并从上到下,从左向右进行编号,根节点编号为1,其左儿子是2,右儿子是3,一次类推: # define ls

NOI模拟赛Day2

馋奶兔 提交于 2020-02-26 20:57:41
深深的感受到了自己的水 -------------------------------------------------------------------------------------------------------------------------- T1: 题意:一棵树,有k个关键点,求分成连通块,每块至少一个关键点,使连通块最大最小。 woc我为啥没想到二分,不懂啊,考试的时候是在梦游吗 二分后判断是否可行 就是一个简单的树上的贪心 可以先bfs一遍倒着来,max表示改点最多能连几个点,sum表示实际有几个点 当改点是关键点时max=k-1 否则sum++ 判断改点f=max>=sum?max-sum:-sum if(f<0)sum[fa[x]]-=f; else f更新max[fa[x]] //这里是取max,因为两个联通块是不可能交的 -------------------------------------------------------------------------------------------------------------------------- T2: 我只会40~60分做法 ---------------------------------------------------------------------------

30.连续子数组的最大和(java)

怎甘沉沦 提交于 2020-02-26 18:41:11
题目描述 HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学。今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决。但是,如果向量中包含负数,是否应该包含某个负数,并期望旁边的正数会弥补它呢?例如:{6,-3,-2,7,-15,1,2,2},连续子向量的最大和为8(从第0个开始,到第3个为止)。给一个数组,返回它的最大连续子序列的和,你会不会被他忽悠住?(子向量的长度至少是1) 解题思路 对于一个数A,若是A的左边累计数非负,那么加上A能使得值不小于A,认为累计值对整体是有贡献的。如果前几项的累计值为负数,则认为有害于总和,sum记录当前值。此时,若和大于maxSum,则用maxSum记录下来。 public class Solution { public int FindGreatestSumOfSubArray(int[] array) { if(array.length==0) return 0; int maxSum = array[0]; int sum = 0; for(int i=0;i<array.length;i++) { if(sum>0) sum += array[i]; else { sum = array[i]; } if(maxSum<sum) maxSum=sum; } return

LeetCode周赛-177

我只是一个虾纸丫 提交于 2020-02-26 14:30:06
1.日期之间隔几天 【思路】计算两个日期和1970-1-1之间相隔的天数,然后相减即可。需要注意闰年闰月的判断。 int getday(int *d1){ int month[12]={31,28,31,30,31,30,31,31,30,31,30,31}; int day1=0,i; for(i=1970;i<d1[0];i++){ if(i%400==0||(i%100!=0&&i%4==0)){ day1+=366; }else{ day1+=365; } } for(i=1;i<d1[1];i++){ day1+=month[i-1]; if(i==2){ if(d1[0]%400==0||(d1[0]%4==0&&d1[0]%100!=0)){ day1++; } } } day1+=d1[2]; return day1; } int* getdate(char * date){ int i,len,top=0; int *num=(int*)malloc(sizeof(int)*3); // memset(num,0,sizeof(num)); num[0]=0;num[1]=0;num[2]=0; len=strlen(date); for(i=0;i<len;i++){ if(date[i]=='-'){ top++;continue; } num[top]

How to sum numbers from input?

百般思念 提交于 2020-02-26 04:16:45
问题 I am working on the following problem. Write a program that continually prompts for positive integers and stops when the sum of numbers entered exceeds 1000. But my code stop early if a negative integer is entered. The numbers will not sum. My code: x = int(input("Enter an integer:")) total = 0 sum = 0 while (0 <= x): if sum <= 1000: x += 1 sum += (int(input("Enter an integer:"))) elif sum >= 1000: break 回答1: x = 0 total = 0 sum = 0 while sum <= 1000: x = int(input("Enter an integer:")) if x