
51Nod
多一些不为什么的坚持
qq:1216161552
展开
-
51Nod 1002 数塔取数问题
#include#includeusing namespace std;int main(){ int n; scanf("%d",&n); int a[501][501]; for(int i=0;i<n;i++){ for(int j=0;j<=i;j++) scanf("%d",&a[i][j]); } for(int i=n-1;i>=1;i--){ for(in原创 2017-11-06 15:14:00 · 226 阅读 · 0 评论 -
51Nod 1428 活动安排问题 贪心+优先队列
先对结构体进行排序,根据开始时间从小到大维护一个结束时间的优先队列。if 一个开始时间小于优先队列的top。肯定要开一个新教室(开始时间小于最小的结束时间,没有教室可以用)else 最小结束时间的那个教室被新的时间占用,弹出top每次都要把结束时间放进优先队列#include #include #include #include #include#includ原创 2017-12-11 17:10:30 · 254 阅读 · 0 评论 -
51Nod 1432 独木舟 贪心
贪心,从小到大排序之后,从第一个人开始,每次都找和自己体重相差最大并且还能上船的例如 6 6 1 2 3 4 5 6肯定要 1 5配 2 4配这样才能把重的最大利用掉可以定义一个index用于遍历的索引#include #include #include #include #include#include #include#include原创 2017-12-11 17:45:54 · 228 阅读 · 0 评论 -
51Nod 1433 0和5 倍数
类似于3的倍数。9的倍数,各项加起来一定是9的倍数10的倍数,肯定有0所以只要把5的个数记录下来,遍历。判断几个5相加能组成9的倍数然后必须有个0.最后输出就好#include #include #include #include #include#include #include#include#includeusing namespac原创 2017-12-11 19:08:40 · 246 阅读 · 0 评论 -
51Nod 1489 蜥蜴和地下室 DFS
第一次在51Nod上用深搜....注意题目说的是血量小于0才死亡。我就把血量全部加一,最后判断血量小于等于0为的是避免刚开始把第一个和最后一个弄死的时候的误差#include #include #include #include #include#include #include#include#includeusing namespace std;int原创 2017-12-11 19:55:40 · 271 阅读 · 0 评论 -
51Nod 1596 搬货物 二进制
思路就是二进制把所有的数累加起来,然后看二进制有多少个1转换一下,因为2^1e6很大,存不下,可以用数组记录二进制的大小然后对数组进行二进制加法。求出来最后1的个数例如 样例a[1]=2 a[2]=1 a[3]=2然后二进制加法计算 a[1]=0,a[2]=0.a[3]=1,a[4]=0;a[5]=1;对应相加:2^3+2^5=24 就是输入的和判断二进制中1的个数原创 2017-12-11 20:50:43 · 202 阅读 · 2 评论 -
51Nod 1649 齐头并进 最短路
分别对公路和铁路进行最短路径计算,然后判断两个路径的最大值题目很多让你误解的地方,例如不能同时在一个站台停。或者说每条路可以用多次因为所有的路径都是相连的。所以在相同的步数不可能同时在一个点题目说的汽车的路线最短情况应该是1--4 一小时到达#include #include #include #include #include#include #i原创 2017-12-12 19:16:22 · 309 阅读 · 0 评论 -
51Nod 1873 初中的算术 BigDecimal
这种题不得不拿出我的java了要用toPlainString() 用tostring()保留的结果是科学计数法然后stripTrailingZeros()去掉后面多余的0最后判断一下开头是否是0就行import java.math.BigDecimal;import java.util.Scanner;public class Main { public stat原创 2017-12-12 19:40:18 · 275 阅读 · 0 评论 -
51Nod 1013 3的幂的和 快速幂
等比数列求和,然后快速幂(a/b)%mod=a*b^(mod-2)%mod#include #include #include #include #include#include #include#include#includeusing namespace std;int mod=1000000007;long long ksm(int len,int x)原创 2017-12-12 19:53:06 · 231 阅读 · 0 评论 -
51Nod 1065 最小正子段和 前缀和
遇到这种题还是得想下前缀和。有可能会有想不到的惊喜#include #include #include #include #include#include #include#include#includeusing namespace std;typedef struct node{ int index; long long sum;}node; b原创 2017-12-13 16:05:43 · 228 阅读 · 0 评论 -
51Nod 1096 距离之和最小
排序找中位数#include #include #include #include #include#include #include#include#includeusing namespace std;int main(){ int n; scanf("%d",&n); int a[10001]; for(int i=0;i<n;i++){ scan原创 2017-12-13 16:42:46 · 261 阅读 · 0 评论 -
51Nod 1413 权势二进制
这题很巧妙啊!!结果就是一个数的位上的最大值例如42197第一次减去 11111第二次减去 11011第三次减去 10011。。。。。。最后一次要减去 10就这意思!#include #include #include #include #include#include #include#include#includeusing nam原创 2017-12-11 15:59:23 · 200 阅读 · 0 评论 -
51Nod 1279 扔盘子 栈模拟
先对井进行优化一下例如从上到下井口大小 6 4 8 5 3优化后的井口为 6 4 4 4 3意思就是把多余的井口长度去掉,因为下面的井口必须小于等于当前最小长度的井口然后进行栈模拟TIP:注意!!!!minn设的初值大一点。我开始用的1#include #include #include #include #include#include #in原创 2017-12-10 20:56:52 · 206 阅读 · 0 评论 -
51Nod 1082 与7无关的数 (打表)
#include#includeusing namespace std;int check(int x){ if(x%7==0) return 0; while(x){ if(x%10==7) return 0; x/=10; } return 1;}void init(long long a[]){ for(int i=1;i<=1000000;i++) if(原创 2017-11-06 15:33:00 · 214 阅读 · 0 评论 -
51Nod 1031 骨牌覆盖
#include #include #include #include #include#include #includeusing namespace std; const int mod=1e9+7;int main(){ int n; int a[1010]={0}; a[0]=a[1]=1; cin>>n; for(int i=2;i<=n;i++)原创 2017-11-30 16:18:02 · 182 阅读 · 0 评论 -
51Nnod 1050 循环数组最大子段和
分两种情况。1 不循环,就是按照0--n-1遍历找最大和2 循环。那么区间肯定是过了起点然后总和减去这个最小字段和。判断两种情况的大小#include #include #include #include #include#include #includeusing namespace std; const int mod=1e9+7;i原创 2017-11-30 16:59:09 · 188 阅读 · 0 评论 -
51Nod 1062 序列中最大的数 打表
打个表#include #include #include #include #include#include #includeusing namespace std; int n;int a[100001]={0};int main(){ cin>>n; a[0]=0,a[1]=1; int maxn[100010]={0}; maxn[0]=0原创 2017-11-30 18:35:43 · 187 阅读 · 0 评论 -
51Nod 1067 Bash游戏 V2 找规律
打表前20个,找规律#include #include #include #include #include#include #includeusing namespace std; int main(){ char a[10]={"ABAAAABA"}; int n; scanf("%d",&n); while(n--){ int num; scan原创 2017-11-30 19:07:54 · 175 阅读 · 0 评论 -
51Nod 1094 和为k的连续区间 map
最初的做法是求出来前缀和,然后sort排序。错!!当时考虑不周到,找到一个下表,要遍历这个 下表的左右元素,找到最小的下表感觉麻烦就没处理然后用map保存一个数。直接判断这个数是否存在。输出即可#include #include #include #include #include#include #include#includeusing namespace原创 2017-11-30 21:01:19 · 287 阅读 · 0 评论 -
51Nod 1095 Anigram单词 map
两个map分别记录排序前和排序后的数量,然后用排序后的-排序前的因为相同的两个单词不是Anigram单词#include #include #include #include #include#include #include#includeusing namespace std; int main(){ int n; cin>>n; map str;原创 2017-11-30 21:10:20 · 187 阅读 · 0 评论 -
51Nod 1119 机器人走方格 V2 组合
51Nod 1118 机器人走方格(dp/快速幂)用高中学的排列组合做C(n-1,n+m-2)最后要求(x/y) %mod =x*(y^(mod-2))%mod;然后用快速幂注意longlong#include #include #include #include #include#include #include#includ原创 2017-12-01 11:11:45 · 243 阅读 · 0 评论 -
51Nod 2020 排序相减
#include #include #include #include #include#include #include#include#includeusing namespace std;int getmax(int *a){ int sum=0; for(int i=3;i>=0;i--){ sum=sum*10+a[i]; } return sum原创 2017-12-10 19:33:19 · 268 阅读 · 0 评论 -
51Nod 1874 字符串排序 逆序对
暴力也可以#include #include #include #include #include#include #include#include#includeusing namespace std;typedef struct node{ char a[55]; int index; int len;}node;int tree[50]={0};i原创 2017-12-10 20:07:31 · 303 阅读 · 0 评论 -
51Nod 1097 拼成最小的数 排序
sort()排序一下就好了,注意输出1000个字符一行#include #include #include #include #include#include #include#include#includeusing namespace std;bool cmp(string s1,string s2){ return s1+s2<s2+s1;}int ma原创 2017-12-13 18:58:46 · 209 阅读 · 0 评论 -
51Nod 1126 求递推序列的第N项 矩阵快速幂
矩阵快速幂对矩阵[a,b,1,0]求n-2次幂,因为f[1]=f[2]=1。没有f[0],所以对矩阵[a,b,1,0]求n-2次幂,又因为进行快速幂的时候令sum=n1,减少一次运算。所以是n-3次幂注意会产生负数的情况假如a是负数 a%b=(a%b+b)%b#include #include #include #include #include#原创 2017-12-05 20:17:27 · 221 阅读 · 0 评论 -
51Nod 1133 不重叠的线段 贪心
贪心,根据右区间排序#include #include #include #include #include#include #include#include#includeusing namespace std;typedef struct node{ int x,y;}node;bool cmp(node n1,node n2){ return n1.y原创 2017-12-05 20:36:47 · 247 阅读 · 0 评论 -
51Nod 1127 最短的包含字符串 (尺取法)
假设我们已经有一个区间包含了26个英文字母然后对左区间向右移动,一直到该区间不包含26个英文字母然后继续对右区间进行移动然后每次更新,求最短的区间距离#include #include #include #include #include #include #include#includeusing namespace std;int shu[30]=原创 2018-01-03 17:11:22 · 381 阅读 · 0 评论 -
51Nod 1393 0和1相等串 (还是前缀和)
把0变成-1,然后求前缀和,如果出现前缀和一样的,说明这俩个前缀和之间的-1和1的个数及01的个数相同然后每次比较最大值#include#include#include#include #includeusing namespace std;int main(){ static char s[1000000+10]; scanf("%s",s); static int原创 2018-01-31 21:25:15 · 200 阅读 · 0 评论 -
51Nod 1396 还是01串 (还是前缀和)
还是前缀和,主要是全0和全1的情况特殊判断一下#include#include#include#include #includeusing namespace std;int main(){ static char s[1000000+10]; scanf("%s",s); static int a1[1000000+10]={0}; static int a0[10000原创 2018-01-31 21:46:14 · 194 阅读 · 0 评论 -
51Nod 1414 冰雕 (暴力模拟)
题目要求更换掉一些冰雕后还是一个正多边形说明更换掉的都是n的因子有个坑!!!保存因子的时候如果上界是sqrt(n),第16的样例过不去#include#include#include#include #include#includeusing namespace std;int main(){ int len; while(scanf("%d",&原创 2018-01-31 22:53:56 · 222 阅读 · 0 评论 -
51Nod 1416 两点
深搜就行注意判断条件首先步数要>=3然后从A点走到下一个点B的时候,B在走一下不不允许走到A满足之后就是出现v[][]数组==1的时候,就存在环#include#include#include#include #include#includeusing namespace std;int n,m;char s[100][100];int v[100][100]原创 2018-01-31 23:36:29 · 306 阅读 · 0 评论 -
51Nod 1267 4个数和为0 (二分!!)
当时自己想的二分是直接搜索中间数!然后想在从这个点遍历前后,贼麻烦发现二分也可以两边同时进行。。长知识了#include#include#include#include #includeusing namespace std;typedef struct node{ int x,y; long long sum;}node;bool cmp(node n1,no原创 2018-01-24 22:53:53 · 216 阅读 · 0 评论 -
51Nod 1268 和为K的组合 (Dp,暴力)..数据水了
数据确实水了。。数组没开到10^9也过了#include#include#include#include #includeusing namespace std;int main(){ int n,k; cin>>n>>k; int a[30]; for(int i=0;i<n;i++){ scanf("%d",&a[i]); } static int f[1000原创 2018-01-24 23:09:30 · 201 阅读 · 0 评论 -
51Nod 1272 最大距离 (排序,维护下标)
首先先对结构体排序,从小到大然后只需要维护一个下标。每次更新下标的最小值因为后面的数肯定都是大于前面的所以只要看下标满足一个增长的即可#include#include#include#include #includeusing namespace std;typedef struct node{ int index,num;}node;bool cmp(node原创 2018-01-25 13:19:15 · 221 阅读 · 0 评论 -
51Nod 1276 岛屿的数量 (。。。。还是年轻了)
自己能想到的就是暴力了。肯定超时嘛!自己还是缺乏思考主要还是看了大牛的题解这样理解 一个岛如果他的前后岛都淹没了(也就是山峰),然后在淹没这个岛的时候,总岛屿数量--相反,如果一个岛他的前后岛都没有淹没(也就是山谷),然后开始淹没这个岛,这时候总岛屿的数量++然后对岛屿和查询的都进行排序,用j变量减少运算,防止超时#include#include#i原创 2018-01-25 14:15:03 · 265 阅读 · 0 评论 -
51Nod 1483 化学变换
把一个数能到达的所有数全部保存起来如果途中的某个数到达的次数==n。说明这个数是n个数都能到达的数#include#include#include#include #include#includeusing namespace std; int v[100000+10]={0};int step[100000+10]={0};void f(int num){原创 2018-02-01 22:41:14 · 253 阅读 · 0 评论 -
51Nod 1117 聪明的木匠 (优先队列构造哈夫曼树)
#include #include #include #include #include #include #include#includeusing namespace std;int main(){ int n; scanf("%d",&n); priority_queue ,greater > que; for(int i=0;i<n;i++){ i原创 2018-01-02 20:56:54 · 348 阅读 · 0 评论 -
51Nod 1116 K进制下的大数 (直接36*1e5暴力)
暴力。。没想到啥巧#include #include #include #include #include #include #include#includeusing namespace std;int main(){ char s[100001]; scanf("%s",s); int minn=0,len=strlen(s); for(int i=0原创 2018-01-02 20:30:16 · 226 阅读 · 0 评论 -
51Nod 1138 连续整数的和
把n项连续的求和公式写出来 n=len*a1+len*(len-1)/2 len代表长度变形一下。len最大取sqrt(2*n) 然后遍历求a1#include #include #include #include #include#include #include#include#includeusing namespace std;int main(){原创 2017-12-05 20:54:00 · 243 阅读 · 0 评论 -
51Nod 1289 大鱼吃小鱼 模拟
栈模拟出现向右移动的鱼,进栈。出现向左的鱼比较栈内的元素和这个鱼大小。栈内鱼小就出栈,否则当前鱼死如果出现向左移动,但是栈空,sum++#include #include #include #include using namespace std; int main(){ int n; cin>>n; stack que; int sum=0; for(i原创 2017-11-26 14:14:35 · 346 阅读 · 0 评论