sum

leetcode编程题(5)

独自空忆成欢 提交于 2020-03-17 03:34:13
561. 数组拆分 I 原文链接: https://leetcode-cn.com/problems/array-partition-i/ 思路分析:进行升序排序后者写一对对的数是就现在的数组元素,每对最小数相加就是数组偶数位元素相加 代码: class Solution { public int arrayPairSum(int[] nums) { Arrays.sort(nums); int sum = 0; for(int i = 0;i<nums.length;i+=2) { sum = sum+nums[i]; } return sum; } } 977. 有序数组的平方 原文链接: https://leetcode-cn.com/problems/squares-of-a-sorted-array/ 思路分析:对数组每个元素计算平方值,后对数组进行排序。 代码: class Solution { public int[] sortedSquares(int[] A) { int[] sum = new int[A.length]; for (int i = 0; i < A.length; ++i){ sum[i] = A[i] * A[i]; } Arrays.sort(sum); return sum; } } 1051. 高度检查器 原文链接: https:/

洛谷P3327 [SDOI2015]约数个数和 【莫比乌斯反演】

落爺英雄遲暮 提交于 2020-03-16 12:51:25
题目 设d(x)为x的约数个数,给定N、M,求 \(\sum_{i = 1}^{N} \sum_{j = 1}^{M} d(ij)\) 输入格式 输入文件包含多组测试数据。第一行,一个整数T,表示测试数据的组数。接下来的T行,每行两个整数N、M。 输出格式 T行,每行一个整数,表示你所求的答案。 输入样例 2 7 4 5 6 输出样例 110 121 提示 1<=N, M<=50000 1<=T<=50000 题解 好神的题【 是我太弱吧 】 首先上来就伤结论。。 题目所求 \[ans = \sum_{i = 1}^{N} \sum_{j = 1}^{M} d(ij)\] 有一个这样的结论: \[d(ij) = \sum_{x|i}\sum_{y|j} [gcd(x,y) == 1]\] 那么就转化为了: \[ans =\sum_{i = 1}^{N} \sum_{j = 1}^{M} \sum_{x|i}\sum_{y|j} [gcd(x,y) == 1]\] 我们考虑对于每一对互质的x、y,x会被枚举 \(\lfloor \frac{N}{x} \rfloor\) 次,y会被枚举 \(\lfloor \frac{M}{y} \rfloor\) 次 所以有 \[ans =\sum_{i = 1}^{N} \sum_{j = 1}^{M} \lfloor \frac{N}{i}

分支-13. 计算天数

不打扰是莪最后的温柔 提交于 2020-03-16 09:24:52
本题要求编写程序计算某年某月某日是该年中的第几天。 输入格式: 输入在一行中按照格式“yyyy/mm/dd”(即“年/月/日”)给出日期。注意:闰年的判别条件是该年年份能被4整除但不能被100整除、或者能被400整除。闰年的2月有29天。 输出格式: 在一行输出日期是该年中的第几天。 输入样例1: 2009/03/02 输出样例1: 61 输入样例2: 2000/03/02 输出样例2: 62 import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner input = new Scanner(System.in); String inputs = input.nextLine(); String[] date = inputs.split("/"); int length = date.length; int d[] = new int[length]; for(int i = 0;i < length;i++) d[i] = Integer.parseInt(date[i]); int sum = 0; for(int j = 1;j < d[1];j++) { switch(j) { case 1: case 3: case 5: case 7:

D. Beautiful numbers(数位DP)

a 夏天 提交于 2020-03-16 07:17:59
题目链接: https://codeforces.com/contest/55/problem/D 题目大意: 给你一个区间,让你求出这个区间里面有多少个数是满足这个数能被 他的所有位上的数 整除的。 具体思路: 对于能被他的所有位上的数整除这个条件,转换一下就是这个数能够整除他的所有位上的lcm。 但是这样的话还是需要求出这个数是谁。因为数的范围比较大,所以就应该考虑取模; 具体取模的时候,我们可以先算出1~9的lcm,这个是求的过程中的最大的lcm。我们在求这个数是什么的时候,就每次取模1~9的lcm就可以了。 但是这样的话,这个数组是要dp[19][2520+5][2520+5]这样的话,是会爆内存的。 然后内存还可以优化一下,这里的第三位表示的是当前的lcm 是多少,这一部分我们是可以预处理出来的,能够被2520整除的只有48个,也就说第三维我们是可以降到50的。 顺便还学到了一个数位DP的一个巨大的优化,就是对dp赋值的时候,我们没有必要每一次都对他清零。对于这个题,dp[i][j][k]表示前i位,当前的数是多大(mod2520),当前的位数lcm是多少。 也就是说这里并没有关于首位的标志(如果是开的四位的话,这样复杂度就会优化很小了)。 AC代码: 1 #include<bits/stdc++.h> 2 using namespace std; 3 # define

js数组案例

不想你离开。 提交于 2020-03-15 17:17:41
1. 求数组 [2,6,1,7, 4] 里面所有元素的和以及平均值。 // (1)声明一个求和变量 sum。 // (2)遍历这个数组,把里面每个数组元素加到 sum 里面。 // (3)用求和变量 sum 除以数组的长度就可以得到数组的平均值。 var arr = [2, 6, 1, 7, 4]; var sum = 0; var average = 0; for (var i = 0; i < arr.length; i++) { sum += arr[i]; // 加的是数组元素 arr[i] 不是计数器 i } average = sum / arr.length; console.log(sum, average); // 想要输出多个变量,用逗号分隔即可 2、 求数组[2,6,1,77,52,25,7]中的最大值 var arr = [2, 6, 1, 77, 52, 25, 7, 99]; var max = arr[0]; for (var i = 1; i < arr.length; i++) { if (arr[i] > max) { max = arr[i]; } } console.log('该数组里面的最大值是:' + max); 3、 将数组 ['red', 'green', 'blue', 'pink'] 转换为字符串,并且用 | 或其他符号分割 //

LeetCode 两数相加

旧时模样 提交于 2020-03-14 10:05:03
https://leetcode-cn.com/problems/add-two-numbers/ 给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。 如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。 您可以假设除了数字 0 之外,这两个数都不会以 0 开头。 示例: 输入:(2 -> 4 -> 3) + (5 -> 6 -> 4) 输出:7 -> 0 -> 8 原因:342 + 465 = 807解答(Java): /** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { val = x; } * } */ class Solution { public ListNode addTwoNumbers(ListNode l1, ListNode l2) { ListNode resNode = new ListNode(0); ListNode resNext = resNode; int carry = 0; while (l1 != null || l2 != null) { int sum = carry;

HDU1828 Picture

余生长醉 提交于 2020-03-14 09:00:14
----------------------- 扫描线求周长 链接(HDU): Miku 链接(Vjudge): Miku ----------------------- HDU是多组数据!!!而且不写明白了!!! 我本以为既然多组数据,何不写上一共几组,既然不写,那必然是不存在了 但是它就是多组数据 ---------------------- 这道题显然的做法是扫描两次,横着一次竖着一次,不过会很繁琐 事实上,一次就够了 ----------------------- 完全可以从上向下扫描一次,对于竖线,显然就是两条线段之间的高度*区间个数*2(更新前) 而对于横线,就是两次的区间长度之差的绝对值(因为无论是+还是-,裸露出来的就是变化的长度) ------------------------- 这样就变成了两个小问题了 横线的求法,没有特别之处,但是竖线,因为是求区间线段数,就要特别处理一下了 我用了额外两个数组,ld,rd,代表一个区间的左右端点是否被覆盖,显然左端点就是左儿子左端点,右端点同理 但是如果左右儿子连起来了,还要特判 所以pushup更长了 void pushup(int x,int l,int r){ if(lazy[x]>=1){ sum[x]=r-l+1; summ[x]=2; ld[x]=rd[x]=1; } else if(l!=r){ sum[x]

【poj3468】 A Simple Problem with Integers

拈花ヽ惹草 提交于 2020-03-14 08:09:21
http://poj.org/problem?id=3468 (题目链接) 题意   给出一个序列,要求维护区间修改与区间求和操作。 Solution   多年以前学习的树状数组区间修改又忘记了→_→。   其实就是用树状数组维护一个差分序列${delta[i]}$,${delta[x]}$记录${[i,n]}$中每一个数的增量,每次修改${[l,r]}$就转化为了${delta[l]+=d,delta[r+1]-=d}$。   对于求和操作${[l,r]}$,其实就是${sum(x)-sum(y)}$,我们这里只讨论${sum(x)}$的求法。     $${sum(x)=s[x]+delta[1]*x+delta[2]*(x-1)+delta[3]*(x-2)+······+delta[x]}$$   其中${s[x]}$表示原数组的前缀和。     $${sum(x)=s[x]+\sum_{i=1}^{x}{delta[i]*(x-i+1)}}$$     $${sum(x)=s[x]+(x+1)*\sum_{i=1}^{x}{delta[i]}-\sum_{i=1}^{x}{i*delta[i]}}$$   于是我们用两个树状数组维护${delta[i]}$与${delta[i]*i}$即可。 细节   更新与求和的时候的下标一定不要打错,没注意到,贡献1Wa→_→。 代码

返回一个整数数组中最大子数组的和。

。_饼干妹妹 提交于 2020-03-12 17:12:21
要求:   输入一个整形数组,数组里有正数也有负数。   数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。   求所有子数组的和的最大值。要求时间复杂度为O(n)   发表一篇博客文章讲述设计思想,出现的问题,可能的解决方案(多选)、源代码、结果截图、总结。 一开始的代码只实现了功能,并没有达到要求的时间复杂度为O(n),设计思想为:先定义sum赋值数组中的最大值,然后开始遍历,先从第一个数开始加比如:1,2,3,4,5,6,7,8,9,10 先从1开始加,1+2然后赋值给sum1,再给sum比较,把较大者赋值给sum,然后1+2+3重复以上步骤,等到1加完后,再从2开始重复以上步骤直到结束。 代码为: import java.util.Scanner; public class Shuzu{ public static void main(String[] args){ Scanner sc=new Scanner(System.in); System.out.println("输入10个数"); int num[]=new int[10]; int sum=0; int sum1=0; for(int i=0;i<10;i++) { num[i]=sc.nextInt(); if(num[i]>sum) { sum=num[i]; } } for(int i=0

软件工程概论课堂作业3

假如想象 提交于 2020-03-12 17:08:27
题目:返回一个整数数组中最大子数组的和 要求: 输入一个一维整形数组,数组里有正数也有负数。 一维数组首尾相接,象个一条首尾相接带子一样。 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。 求所有子数组的和的最大值。 设计思想 : 用户自定义数组长度并依次输入数组元素,设一个全局变量初始化为零的数组a[N],N=10000; 1.因为该数组首尾相接可视作一个环,那么我们需要在一个合适的位置断开,把数组元素展成一条笔直的带子。 (1).设用户自定义数组长度为m,输入数组各元素值a[1]~a[m],在for循环中加入代码a[m+i]=a[i];(即复制输入的数组接在该数组最后一个数后面,其中i为循环变量) 例:若输入的数组为 1,-2,3,-4,5 那么实际生成的数组为1,-2,3,-4,5,1,-2,3,-4,5 (2).找出合适的位置断开,这个合适的位置即整个数组的最小值处,写一个函数找出输入的数组的最小值使该数排在第一位。 例:输入数组为 1,-2,3,-4,5 那么找出最小元素-4的位置并使其在第一位,所以实际生成并计算的数组为(下划线部分):1,-2,3, -4,5,1,-2,3 ,-4,5 2.在合适位置断开确定好数组后,根据第一次课堂作业(不考虑首尾相接的情况)计算 (1).从数组第一个不为零的元素累加,设累加值为S,为判断数组第一个不为负的元素