int函数

22行代码AC——习题5-6 对称轴(Symmetry,UVa1595)——解题报告

谁说我不能喝 提交于 2020-03-12 10:35:47
励志用尽量少的代码做高效的表达。 题目(提交)链接→ UVa-1595 思路: 此题本质是一道笛卡尔坐标系上的对称性问题。 判定性问题:由于只要能判别图像是否左右对称即可,无需确认关于哪条垂直线对称,那么问题可以这样解决:将坐标升序排序后,若两侧坐标和都等于sum,再判断二者y值相同。就说明关于某条线对称。 最开始想到用 pair 结构体, p.first 存储x坐标, p.second 存储y坐标。重写 cmp() 函数,利用 sort() 对 pair 进行升序排序, (x1+x2)/2 求出 sum ,依次比较,若符合条件,则输出。 但这个想法是有bug的: 错误 :(x1+x2)/2可能是小数,而sum是int型,造成数据不准确。 解决办法:减法代替除法(坐标运算尽量避免除法),具体见代码第15行。 待优化 :用 set<pair<int,int>>s ; 代替 pair<int,int>p + sort() 。提高效率。 下面是优化后的代码: 代码: # include <bits/stdc++.h> using namespace std ; int main ( ) { int n ; cin >> n ; while ( n -- ) { int m , x , y ; cin >> m ; set < pair < int , int >> st ; int

C++风格的常用排序算法(冒泡,选择,插入,归并,选择)

时光毁灭记忆、已成空白 提交于 2020-03-12 07:45:31
C++风格的常用排序算法(冒泡,选择,插入,归并,选择) # include <vector> # include <array> # include <iostream> using namespace std ; # define vint vector<int> //异或置换函数 void swapab ( int & a , int & b ) { a = a ^ b ; b = a ^ b ; a = a ^ b ; } //冒泡排序 vint mp ( vint arr ) { int temp = 0 ; for ( int i = 0 ; i < arr . size ( ) ; i ++ ) { for ( int j = 0 ; j < arr . size ( ) - i - 1 ; j ++ ) { if ( arr [ j ] > arr [ j + 1 ] ) { swapab ( arr [ j ] , arr [ j + 1 ] ) ; } } } return arr ; } //选择排序 vint xz ( vint arr ) { int is = 0 ; int currMin = 0 ; int temp = 0 ; for ( int i = 0 ; i < arr . size ( ) ; i ++ ) { currMin = i ;

(PTA)6-2 使用函数求1到10的阶乘和 (10分)

风格不统一 提交于 2020-03-11 23:35:25
本题要求实现一个计算非负整数阶乘的简.单函数,使得可以利用该函数,计算1!+2!+⋯+10!的值。 函数接口定义: double fact( int n ); 其中n是用户传入的参数,其值不.超过10。如果n是非负整数,则该函数必须返回n的阶乘。 裁判测试程序样例.: #include <stdio.h> double fact( int n ); int main(void) { int i; double sum; sum = 0; for(i = 1; i <= 10; i++) sum = sum + fact(i); printf("1!+2!+...+10! = %f\n", sum); return 0; } /* 你的代码将被嵌在这里 */ 输入样例: 本题没有输入。 输出样例: 1!+2!+…+10! = 4037913.000000 double fact ( int n ) { int i ; double p ; p = 1 ; for ( i = 1 ; i <= n ; i ++ ) { p = p * i ; } return p ; } 来源: CSDN 作者: Overdrive13 链接: https://blog.csdn.net/Overdrive13/article/details/104804960

算法题目积累0721

喜你入骨 提交于 2020-03-11 21:53:58
1,两个字符串的最长公共子串 基本思想是 扫描两次矩阵 ,第一次进行字符比较;第二次找出对角线为1的最长长度 package com.bobo.interview; import com.bobo.util.MetrixPrint; /** * 这个类实现的功能室查找两个字符串的最长公共子串(要求连续) * 扫描两次矩阵,第一次的时候是两个字符串的比较,相等的位置赋值1,不等的位置赋值0 * 第二次扫描,找出对角线为1的最大长度 * 需要注意的是:分支不止一个的情况 * @author weibo.lwb * */ public class LargestCommonStr { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub LargestCommonStr test=new LargestCommonStr(); test.largestCommonStr("abce", "ebcen"); } public int largestCommonStr(String str1,String str2){ int n=str1.length(); int m=str2.length(); int metrix[][]=new int[n]

349. Intersection of Two Arrays

南楼画角 提交于 2020-03-11 21:39:33
Given two arrays, write a function to compute their intersection. Example: Given nums1 = [1, 2, 2, 1] , nums2 = [2, 2] , return [2] . Note: Each element in the result must be unique. The result can be in any order. 来源: https://leetcode.com/problems/intersection-of-two-arrays/ 分析 使用一个hash table来记录nums1中的所有数字是否出现,然后在遍历nums2的所有数字,如果存在,则压入结果,并且把hash table对应值 设 false,保证不再重复压入结果。 空间复杂度:O(N) 时间复杂度:O(N) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 class Solution { public : vector< int > intersection(vector< int >& nums1, vector< int >& nums2) { unordered_map< int , bool > m_map; vector< int > result; for

硬币面值组合

好久不见. 提交于 2020-03-11 18:37:32
【转】 http://www.hawstein.com/posts/8.7.html 题目 原文: Given an infinite number of quarters (25 cents), dimes (10 cents), nickels (5 cents) and pennies (1 cent), write code to calculate the number of ways of representing n cents. 译文: 我们有25分,10分,5分和1分的硬币无限个。写一个函数计算组成n分的方式有几种? 解答 一开始,我觉得使用递归不断地累加四种币值的硬币,当累加到n分,组成方式就加1。 最后就能得到一共有多少种组合方式,听起来挺正确的,然后写了以下代码: int cnt = 0; void sumn(int sum, int n){ if(sum >= n){ if(sum == n) ++cnt; return; } else{ sumn(sum+25, n); sumn(sum+10, n); sumn(sum+5, n); sumn(sum+1, n); } } 但,这是错误的。问题出在哪?有序与无序的区别!这个函数计算出来的组合是有序的, 也就是它会认为1,5和5,1是不一样的,导致计算出的组合里有大量是重复的。 那要怎么避免这个问题?1

传值,传址和传引用

眉间皱痕 提交于 2020-03-11 14:57:49
传值 传值方式:将实参的值拷贝给函数或方法,在函数内对形参进行操作,操作的对象是实参的拷贝,对实参本身没有影响,在函数结束返回后,形参被丢弃释放,实参的内容不会被改变。 c++一条基本原则:在默认情况下,参数只能以值传递的方式给函数,被传递到函数的只是变量的值,永远不会是变量本身。 void exchange(int x,int y) { int temp; temp=x; x=y; y=temp;} exchange(a,b);在调用过程中,函数隐含的把实参ab的值分别传给了形参xy, 函数中的操作只是对形参的操作,没有对实参进行任何操作,因此,实参ab的值是不变的。 传址 传址方式:将实参的地址传递给函数,在函数内对形参进行操作等同于对实参进行相同的操作,在函数调用结束返回后,形参被释放,实参的内容是对形参进行操作后的结果。 绕开值传递问题的第一种方法指针传递,是向函数传递变量的地址取代它的值。 void exchange(int *px,int *py) { int temp=*px; *px=*py; py=temp; } int a=4,b=5; exchange(&a,&b); 将ab的地址传递给函数,对 px,*py的操作即是对a,b变量本身的操作。可以实现a,b的值交换。 交换 void swap(int *x, int *y) { int temp; temp =

集合相关的常用工具类

半城伤御伤魂 提交于 2020-03-11 14:47:21
1. 简介 Java中的集合类既可以当做放其他数据的容器,又可以当做常见的数据结构使用。Java中提供了很多好用的工具类来操作这些集合类。本篇博客就来介绍下常用的集合工具类。集合常用的工具类大体可以分为3类: JDK本身提供的工具类; Guava提供的工具类; Apache common-Collection提供的工具类 2. JDK提供的工具类 主要由下面三个: Arrays Collections Objects Arrays 是操作数组对象的工具类, Collections 是操作集合对象的工具类。 Objects 是操作引用数据类型对象的工具类。 Arrays的常用方法: 普通 排序 : Arrays.sort(int[] a) Arrays.sort(int[] a, int fromIndex, int toIndex) 其他非boolean基础数据类型的数组对象以及实现Comparable接口的类的数组对象均有此方法。 并行排序 :JDK1.8新增。 Arrays.parallelSort(int[] a) Arrays.parallelSort(int[] a, int fromIndex, int toIndex) 其他非boolean基础数据类型的数组对象以及实现Comparable接口的类的数组对象均有此方法。 并行计算 :JDK1.8新增,支持函数式编程

个人笔记:算法讲座3.5——氪金矿(01背包 复杂化)

梦想的初衷 提交于 2020-03-11 13:02:22
本文仅供参考学习使用,谢谢 问题描述: 当Alice努力打怪赚金币的时候,Bob确定了他的致富手段——到乌提斯的矿洞里挖氪金矿,因为他从达纳苏斯的暗夜精灵那里得到了一个特殊的道具,能够瞬间转移到一个氪金矿,却只消耗一个时间单位。挖取每堆矿石消耗的时间不同,当然产出量也不同,时间就是金钱,Bob在有限的时间T内,能挖到多少氪金矿? 输入: 第一行有两个数,时间T和矿洞中氪金矿的个数,第二行开始,每行两个数分别表示 挖这堆氪金矿消耗的时间和矿石产出量。 输出: Bob最多能够获得的矿石数。 思路分析: 01背包问题的状态转换方程: f[i,j] = Max{ f[i+1,j-Wi]+Vi( j >= Wi ), f[i+1,j] } 该问题是一个01背包问题的简单变形,首先要将这个问题分成子问题,然后优化子结构。 根据01背包问题的思想,将N个金矿按照顺序 移动 并 采集并,且逐个考虑时间为1-T时每个时间段所能产生的最大价值 这样每多移向一个金矿 1-T时间内所能产生的最大价值仅和上一次金矿的产生价值有关,即满足了 无后效性 和 逆向组解 考虑某时间段 在某金矿时的最大价值 需要考虑 a=该时间段减去 当前金矿所消耗的时间 在前一个金矿所产生的最大价值+当前金矿所能产生的价值 b=该时间段 在上一个金矿所能产生的最大价值 如果a

【C++】简单的函数

徘徊边缘 提交于 2020-03-11 12:58:58
代码: #include <iostream> using namespace std; // 主函数 int main(){ int a = 2; int b = 5; // max(a,b)是调用自己声明的max函数 // "\n"换行 cout <<"input:"<< a << " " << b << "\n"<< "大数是" << max(a,b) << endl; return 0; } // 声明函数,并定义参数类型 int max(int num1, int num2){ if (num1 > num2){ return num1; }else{ return num2; } } 运行结果: 说明: 1.调用函数 时,这里是直接调用并输出,也可以定义一个变量,把函数结果先保存下来,再输出,或者在其他地方使用 如:result = max(a,b); cout <<"input:"<< a << " " << b << "\n"<< "大数是" << result << endl; //跟上面代码效果一样 2.定义函数参数 时,参数名不重要,也可以只定义参数类型 如:max(int,int) 来源: CSDN 作者: 人人都是量化师 链接: https://blog.csdn.net/CSDN_fzs/article/details/104792657