L++

2018ICPC 北京

不羁的心 提交于 2020-11-03 07:26:09
A.0:27:15 solved by hl 感人的数据范围,每次连上边之后dfs一下前者看能不能找到自己就行 #include <iostream> #include < string > #include <map> #include <vector> #include <cstdio> using namespace std; int N; const int maxn = 110 ; map < string , int > Hash; vector < int > P[maxn]; bool vis[maxn]; int s; bool dfs( int t){ vis[t] = 1 ; for ( int i = 0 ; i < P[t].size(); i ++ ){ int v = P[t][i]; if (v == s) return false ; if (vis[v]) continue ; if (!dfs(v)) return false ; } return true ; } int main() { while (~scanf( " %d " ,& N)){ int cnt; cnt = 0 ; Hash.clear(); for ( int i = 0 ; i < maxn; i ++ ) P[i].clear(); int flag = 0 ;

生成树与最小生成树

旧巷老猫 提交于 2020-10-29 03:35:08
生成树 生成树是 对图遍历访问的一条无回路的遍历路径称为图的生成树,生成树不是唯一的,深度优先和广度优先的访问路径就是一棵生成树.深度优先搜索与广度优先搜索的生成树分别称为***, 最小生成树 最小生成树是对带有权值的图,生成树路径中权值总和最小的路径,称为最小生成树.求最小生成树的算法有 prim(普里姆)算法 和 kruskal(克鲁斯卡尔)算法: prim算法 : 假设图G=(V,E)是有n个顶点的连通图. T=(U,TE)是G的最小生成树,初值为空.首先从V中任选一个顶点放入U.(标记1:)然后从E中取一条边放入TE,这条边要满足:其中一个顶点在U中,一个在U之外(没在U中)。(这样的边不止一条)。这条边是权值最小的那条.然后把不在U的顶点放入U(这条边的另一端)。jump 标记1. 直到V中所有点都在U中, 这时TE中有n-1条边.最小生成树算法结束.算法时间复杂度是O(n2) 代码示例: package stuct; import java.util.LinkedList; import java.util.List; public class Graph2 { int m = Integer.MAX_VALUE; public static void main(String[] args) { Graph2 main = new Graph2(); main.prim

NOIP提高组历年真题题解

人盡茶涼 提交于 2020-10-28 04:59:59
2018 铺设道路 差分水题,推一下结论就好了。 #include<cstdio> #include <algorithm> using namespace std; int a[ 100005 ],d[ 100005 ],ansz,ansf; int main() { int n; scanf( " %d " ,& n); for ( int i= 1 ;i<=n;i++ ) scanf( " %d " ,&a[i]),d[i]=a[i]-a[i- 1 ]; for ( int i= 1 ;i<=n;i++ ) { if (d[i]< 0 ) ansf-= d[i]; else ansz+= d[i]; } printf( " %d\n " ,max(ansz,ansf)); return 0 ; } 货币系统 一开始以为是数学题,后来发现可以$dp$,很有意思的完全背包简单变形。 $f$数组下标存储每一个数,$true$表示已经出现,$false$表示不能被表示。 初始化$f[0]$为$true$。 #include<cstdio> #include <cstring> #include <algorithm> using namespace std; int n,a[ 205 ],f[ 25005 ],T; int main() { scanf( " %d " ,& T);

算法基础:常用的排序算法知识笔记

て烟熏妆下的殇ゞ 提交于 2020-10-05 14:00:50
1、算法外排序分类 2、冒泡排序 冒泡排序(Bubble Sort)属于交换排序,它的原理是:循环两两比较相邻的记录,如果反序则交换,直到没有反序的记录为止。 实现算法: /** * 冒泡排序优化后的算法 * 设置一个标记来标志一趟比较是否发生交换 * 如果没有发生交换,则数组已经有序 */ void bubbleSort(SqList *L){ int i,j; int flag = true; // flag 用来作为标记 for (i = 1; i < L->length && flag; i++) { // 若flag为true 则说明数据交换过,否则没交换过(数组已经有序) 则停止循环 flag = false; for (j = L->length - 1; j >= i; j--) { if (L->r[j] > L->r[j+1]) { swap(L, j, j+1); flag = true; // 如果有数据交换 flag为true } } } } 3、简单选择排序 简单选择排序法(Simple Selection Sort)是通过 n-i 次关键字间的比较,从 n-i+1 个记录中选出关键字最小的记录,并和第i(1<=i<=n)个记录交换。 原理是:每一次从无序数据组的数据元素中选出最小(或最大)的一个元素,存放在无序数组的开始位置,随着无序数组元素减少

基数排序(Java)

会有一股神秘感。 提交于 2020-08-18 14:49:27
基数排序(Java) 博客说明 文章所涉及的资料来自互联网整理和个人总结,意在于个人学习和经验汇总,如有什么地方侵权,请联系本人删除,谢谢! 基数排序(桶排序)介绍 基数排序(radix sort)属于“分配式排序”(distribution sort),又称“桶子法”(bucket sort)或bin sort,顾名思义,它是通过键值的各个位的值,将要排序的元素分配至某些“桶”中,达到排序的作用 基数排序法是属于稳定性的排序,基数排序法的是效率高的稳定性排序法 基数排序(Radix Sort)是桶排序的扩展 基数排序是1887年赫尔曼·何乐礼发明的。它是这样实现的:将整数按位数切割成不同的数字,然后按每个位数分别比较。 基数排序基本思想 将所有待比较数值统一为同样的数位长度,数位较短的数前面补零。然后,从最低位开始,依次进行一次排序。这样从最低位排序一直到最高位排序完成以后, 数列就变成一个有序序列。 特点 空间换时间,稳定 代码 package cn.guizimo.sort; import java.util.Arrays; public class RadixSort { public static void main(String[] args) { int arr[] = {53,45,6,378,15,234,78}; System.out.println("排序前"

LeetCode 第 196 场周赛 (题目:5452-5455,这是参加过最坑的周赛,暴力n^2居然可以过)

谁都会走 提交于 2020-08-17 15:23:08
5452. 判断能否形成等差数列 给你一个数字数组 arr 。 如果一个数列中,任意相邻两项的差总等于同一个常数,那么这个数列就称为 等差数列 。 如果可以重新排列数组形成等差数列,请返回 true ;否则,返回 false 。 示例 1: 输入:arr = [3,5,1] 输出:true 解释:对数组重新排序得到 [1,3,5] 或者 [5,3,1] ,任意相邻两项的差分别为 2 或 -2 ,可以形成等差数列。 示例 2: 输入:arr = [1,2,4] 输出:false 解释:无法通过重新排序得到等差数列。 提示: 2 <= arr.length <= 1000 -10^6 <= arr[i] <= 10^6 class Solution { public boolean canMakeArithmeticProgression( int [] arr) { Arrays.sort(arr); int temp = arr[1]-arr[0 ]; for ( int i=1;i<arr.length;i++ ){ if (temp!=arr[i]-arr[i-1 ]){ return false ; } } return true ; } } 5453. 所有蚂蚁掉下来前的最后一刻 有一块木板,长度为 n 个 单位 。一些蚂蚁在木板上移动,每只蚂蚁都以 每秒一个单位

7.5集训模拟赛8

冷暖自知 提交于 2020-08-16 03:22:08
A. 食物链 题目描述 如图所示为某生态系统的食物网示意图,据图回答此题。 现在给你n 个物种和 m条能量流动关系,求其中的食物链条数。 物种的名称为从1 到 n的编号。 m条能量流动关系形如 其中 a i ,b i 表示能量从物种a i 流向物种b i 。注意单独的一种孤立生物不算一条食物链。 输入格式 第一行两个整数n 和m ,接下来 m行每行两个整数 a i ,b i 描述m 条能量流动关系。 (保证输入数据符合生物学特点,即不存在环,且不会有重复的能量流动关系出现) 输出格式 一个整数,即食物网中的食物链条数。 样例 样例输入 10 16 1 2 1 4 1 10 2 3 2 5 4 3 4 5 4 8 6 5 7 6 7 9 8 5 9 8 10 6 10 7 10 9 样例输出 9 数据范围与提示 分析 此题就是一道简单的dfs,食物链(欺负学地理的,哼)从最低端到最顶端,最低端一定是入度为零的点,最顶端一定是出度为零的点,那么我们只需要统计从每一个低端(入度为零)到每一个顶端(出度为零)的点的有多少不同的路径。 Code #include<bits/stdc++.h> using namespace std; const int N = 2e6; int n,m; int x,y; int rd[N],cd[N]; int dp[N],head[N],cnt;

题解 [NOI2009] 植物大战僵尸

两盒软妹~` 提交于 2020-08-14 09:15:40
  讲网络流的时候没有听懂最大权闭合子图,然后讲题的时候学长问我们这是什么模型。   我就瞎口胡了最大权闭合子图,然后就中了。   总之,依题可知,要吃一个植物,必须吃它右侧的植物,并且吃掉保护它的植物(全都是玉米加农炮嗷)。所以在两个点之间连一条有向边,连完之后发现要获取一个点的分数必须获取所有它连接的点的分数。   所以就是最大权闭合子图辣。不过由于一个植物可能会保护它自己,或者保护(保护它的植物),所以判环,环与环到达的点统统不拿来建图。建个反图跑拓扑排序就好了。   代码: #include <bits/stdc++.h> #define maxn 720005 #define inf 0x3f3f3f using namespace std; long long n,m,tot= 1 ,ans= 0 ; queue < int > q; int head[maxn],nex[maxn],to[maxn],edge[maxn],cur[maxn]; int mapp[ 300 ][ 300 ],vis[maxn],lev[maxn]; int attack[ 605 ][ 605 ],start,endn,cango[maxn]; int in [maxn]; void add( int x, int y, int z){ to[ ++tot]=y;edge[tot]=z

php抽奖功能

旧城冷巷雨未停 提交于 2020-08-12 06:33:54
在项目开发中经常会遇到花钱抽奖类型的需求。但是老板总是担心用户用小钱抽到大奖。这样会导致项目亏损。下边这段代码可以有效制止抽奖项目亏钱。 个人奖池: 语言:thinkphp redis mysql 表:desire抽奖商品表 desire_log用户抽奖奖品表 user_desire_log用户抽奖记录表 desire_risk抽奖风控表 需求:用户奖池分为进行中奖池 和已完成奖池 当用户抽到大奖后 用户个人奖池重置 否则将继续抽奖 最后一次抽奖必中大奖 通过风控金额来判断用户是否可以抽大奖   当所有用户已完成的抽奖 盈利大于风控金额的时候可以让用户抽大奖 否则用户抽不到大奖 <? php     // 抽奖接口 public function desire() { $userData = $this ->userSessionData(); // /用户的唯一标识 $time = time (); $this ->limit_reward_time( $userData ['id'], $time ); // /限制抽奖间隔时间 防止被恶意刷奖品 //活动开启开关 $num = input('num/d' ); if (! $num ) { output( '1008', '参数错误' ); } if ( $num !=1 ){ if ( $num !=10 ){ if (

6.30集训模拟赛4(炸裂的一天qwq)

梦想与她 提交于 2020-08-11 09:33:14
T1浇水:   题目描述   在一条长n米,宽m米米的长方形草地上放置着k个喷水装置。假设长方形草地的坐标范围为[ 0 , 0 ] ~ [ n , m ],那么第 i 个喷水装置的位置为(ai,m /2 ),也就是说喷水装置全部位于一条直线上。此外第 i 个喷水装置能向半径r i 的圆形区域内喷水。 负责管理喷水装置的园丁老大爷想知道,要想覆盖整个草地,至少需要开启多少个喷水装置。   输入格式 第一行三个正整数 k , n , m 。其中 m 为偶数。 接下来 k 行,每行两个整数a i 和r i ,代表第 i 个喷水装置的横坐标和喷水半径。   输出格式 一个整数 ans 代表至少需要开启的喷水装置数量。若所有装置都开启依然不能覆盖整个草地则输出-1 。   样例   样例输入1 9 16 6 0 5 2 5 4 5 6 5 8 5 10 5 12 5 14 5 16 5   样例输出1 2   样例输入2 8 20 2 5 3 4 1 1 2 7 2 10 2 13 3 16 2 19 4   样例输出2 6   数据范围与提示 样例1 解释开启位于4和12的喷水装置即可。 30%的数据中:k ≤ 20。 另有20%的数据中:r i 均相等。 100%的数据中:m≤20000,ri≤10000,n,k≤100000,a i 。   分析:   喷水装置在长方形的中线上