https://www.luogu.org/problemnew/show/P1118 next_permutation的第二个参数是最后一个元素的下一个元素,sort也是一样!有毒!这么低级的错误.而且应该是用do_while因为原始排列也要考虑! 使用sort跳过一些permutation的原理来源于: 1.假设解存在,那么对称位置的两个元素交换也是一种解 2.我们要求第一种解,必定是左边元素小于右边对应元素的 3.当某个排列导致当前大于sum,怎么证明发现该元素之后的任意排列都是大于sum…
洛谷1118 数字三角形游戏 题目描述 有这么一个游戏: 写出一个1-N的排列a[i],然后每次将相邻两个数相加,构成新的序列,再对新序列进行这样的操作,显然每次构成的序列都比上一次的序列长度少1,直到只剩下一个数字位置.下面是一个例子:     3   1   2   4       4   3   6         7   9          16 最后得到16这样一个数字. 现在想要倒着玩这样一个游戏,如果知道N,知道最后得到的数字的大小sum,请你求出最初序列a[i],为1-N的一个…
题目链接:https://www.luogu.org/problemnew/show/P1118 题意: 1~n的一个排列,相邻的两项加起来得到下一行. 现在给定最后一行的数字,问最初的1~n的排列是什么. 思路: next_permutation大法好.但是要注意剪枝. 首先要发现最后一行这个数系数的规律是一个杨辉三角. 先处理出这个系数. 然后排列. 如果我们在加到前i项的时候发现他已经比结果大了,那么后面不管怎么排列都是没有用的,要跳过. 怎么跳过呢,这里还挺tricky的[要学会!] 用…
题目描述 有这么一个游戏: 写出一个1-N的排列a[i],然后每次将相邻两个数相加,构成新的序列,再对新序列进行这样的操作,显然每次构成的序列都比上一次的序列长度少1,直到只剩下一个数字位置.下面是一个例子: 3 1 2 4 4 3 6 7 9 16 最后得到16这样一个数字. 现在想要倒着玩这样一个游戏,如果知道N,知道最后得到的数字的大小sum,请你求出最初序列a[i],为1-N的一个排列.若答案有多种可能,则输出字典序最小的那一个. [color=red]管理员注:本题描述有误,这里字典序…
题目 这个题我们乍一看会有些熟悉.觉得是可以用DP来做的那个题.但是打眼一看,就会发现不对了.因为那个题是顺推而这个题则是逆推. 这样的话可怎么办呢. 我们可以在草稿纸上推一下,我们随便写个数n. 再标个a,b,c,d. 当n=4时 我们可以得到下面的式子 sum=a+3b+3c+d a+2b+c         b+2c+d a+b          b+c         c+d a            b              c           d 因此我们就可以想到杨辉三角了…
题目:https://www.luogu.org/problemnew/show/P1216 题意: 给定一个三角形.从顶走到底,问路径上的数字之和最大是多少. 走的时候可以往左下(实际上纵坐标不变)或是往右下(纵坐标+1) 思路: 用$dp[i][j]$表示从$(1,1)$走到$(i,j)$的最大值. $(i,j)$可以从$(i-1,j)$或是$(i-1,j-1)$走过来 所以$dp[i][j] = max(dp[i-1][j], dp[i-1][j-1]) + num[i][j]$ 初态为$…
题目 这道题是一个典型的DP,可以用倒推,顺推的方法,来解这道题.当然用不同的方法他的循环次序是不一样的,所以我们一定要深刻地理解题目的大意,再采用状态转移方程与边界每次求出最优解,并记录循环一遍后就可以得出答案. 顺推代码 #include<iostream> #include<cmath> #include<algorithm> #include<cstdio> using namespace std; int n,a[10000][10000],f[1…
题目链接 https://www.luogu.org/problemnew/show/P1553 题目描述 给定一个数,请将该数各个位上数字反转得到一个新数. 这次与NOIp2011普及组第一题不同的是:这个数可以是小数,分数,百分数,整数.整数反转是将所有数位对调:小数反转是把整数部分的数反转,再将小数部分的数反转,不交换整数部分与小数部分:分数反转是把分母的数反转,再把分子的数反转,不交换分子与分母:百分数的分子一定是整数,百分数只改变数字部分.整数新数也应满足整数的常见形式,即除非给定的原…
数字三角形 题目链接 4 16 3 1 2 4 3 1 2 4 (3+1) (1+2) (2+4)(3+1+1+2) (1+2+2+4) (3+1+1+1+2+2+2+4)16=1*3+3*1+3*2+1*4 首先,我们可以发现每个数字被加上的次数是一个杨辉三角形的一行 利用公式C(n,i)=(n-i+1)*C(n,i-1)/i 可以推出系数 然后爆搜,加一点小剪枝 #include<iostream> #include<cstring> #include<cstdlib&g…
传送门 洛谷改域名了QAQ 解题思路 没什么好说的,一道红题,本不想发这篇博客 ,但还是尊重一下CCF吧QAQ,怎么说也是第一年CSP呢! 用getchar一个个读入.判断.累加,最后输出即可. 不过要注意getchar是包含在cstdio库里的. AC代码 #include<iostream> #include<cstdio> using namespace std; int ans; int main() { ;i<=;i++){ ') ans++; } cout<…