摘要:好像去了再回来很难记住原来走了哪些?可以从左上角同时走两个路径到右下角,那如何记录两个点的状态?注意到两个点的行+列是相同的,因此可以记录一个时间维+两个坐标维dp[time][x1][x2] time时间一点的横坐标x1和另一点的横坐标x2转移很好想啦== 1 #include 2 #includ...
阅读全文
摘要:转化成1-m里面多少个首尾数字相同数字对于个位数本身满足而其他的,注意到对于每一个x,x/10再加上末尾固定的数即满足,所以答案为m/10+9?最后注意到如果m的个位数 2 long long fun(long long m) 3 { 4 if(m=10) m/=10; 7 if(m...
阅读全文
摘要:dp[i][j]表示前面i个步兵j个马兵排列种数,再枚举一下本次放的步兵和马兵的个数就可以dp了技巧在于:不是一个一个放兵,而是轮流种类放兵== 1 #include 2 #include 3 #include 4 using namespace std; 5 #define MOD 1000000...
阅读全文
摘要:预处理dp[i][j]表示i层取j本书最大价值,利用前缀和来处理,枚举不拿的中间一段,这样预处理O(n^3)随后进行dp,dp[i][j]表示前i层取j本书最大价值,再枚举i层拿k本书,这样也是O(n^3),甚至接近100*10000*100,不过codeforce的速度还是承受住了== 1 #in...
阅读全文
摘要:将每个点与x正半轴夹角利用atan求出来,都在[0,360)之间然后排序,枚举夹角相邻的两个点,ans=min(360-(the[i+1]-the[i])) 1 2 #include 3 #include 4 #include 5 #define eps 1e-10 6 using namespac...
阅读全文
摘要:对比代码量,好大的思维量==其实对于第二个拿相同的木块分的人,他当前放与上一个木块相同最优对于第一个想拿不同木块分的人,他放与上一块木块不同颜色最优第一个人放多的颜色木块更优=至于为什么?>>当前对自己有利就放,否则到后面就无利了 2 #include 3 #include 4 using name...
阅读全文
摘要:这道题目自己能想到还是挺开心的=我的做法是先用筛法将每个数的质数因子放到这个数对应的vector里面然后从首至尾扫这个数组,对每个数查看他的所有质因子最大的长度,最后更新每个质因子的长度,复杂度大概是O(n*数的质因子平均个数),挺快的 1 #include 2 #include 3 #includ...
阅读全文
摘要:图见:http://codeforces.com/problemset/problem/343/B巧妙!将红上蓝下记为1,红下蓝上记为-1,压栈,相同相消,最后栈中无元素即可以分开= 1 #include 2 #include 3 #include 4 #include 5 using namesp...
阅读全文
摘要:串联1Ω电阻:R+1并联1Ω电阻:R/(R+1)这样就从目标电阻倒推回去需要多少个 1 #include 2 #include 3 #include 4 using namespace std; 5 int main() 6 { 7 long long a,b,x,tmp; 8 scanf(...
阅读全文
摘要:范围比较小,直接记忆化搜索=dp[go][pos][i][cnt]表示朝向,位置,字符串行进位置,剩余操作数转移方程思考=注意cnt先可以-2 1 #include 2 #include 3 #include 4 using namespace std; 5 int dp[2][205][105][...
阅读全文
摘要:预处理sum数组,sum[i]表示1-m中有i个4或7的数有多少个,这个数位dp很好写然后就是枚举第七个数含有的4,7数目,dfs剩下的六个数= 1 #include 2 #include 3 #include 4 using namespace std; 5 #define LL long lon...
阅读全文
摘要:如果一个放不下第二个人赢,否则第一个人放在中间,由于对称性,第二个人必败=1 #include2 #include3 int main()4 {5 int n,m,r;6 scanf("%d%d%d",&n,&m,&r);7 if (n>=r*2&&m>=r*2) printf("Fir...
阅读全文
摘要:比较明显的dp了=dp[i][j][flag]前i个栅栏中,红/绿颜料用了j的最小接触值具体转移见程序: 1 #include 2 #include 3 #include 4 using namespace std; 5 int dp[225][45005][2],a[225]; 6 int mai...
阅读全文
摘要:其实就两个方向,不符合就改嘛所以从任意一个点开始,两个方向更改的最小值就是答案== 1 #include 2 #include 3 #include 4 using namespace std; 5 int n,vis[1005]; 6 struct dian{ 7 int num1,num2,...
阅读全文
摘要:转化成a/rev(a)==rev(b)/b这样就容易做了先判断大区间有没有到w个,然后开两个map进行尺取x=n1 y=1如果当前对数>=w x--,否则y++,中间有涉及到两个map的删减以及在满足情况下更新答案 1 #include 2 #include 3 #include 4 #includ...
阅读全文
摘要:最高就是第一名=最低的话贪心,一轮从大到小,另一轮从小到大,尺取最多即最多能有多少个>=k 1 #include 2 #include 3 #include 4 using namespace std; 5 int a[100005],b[100005]; 6 int main() 7 { 8 ...
阅读全文
摘要:不去实际上交换行和列=用两个数组表示当前行/列是原数组哪一行/列,这样只用交换变量 1 #include 2 #include 3 #include 4 using namespace std; 5 int a[1005][1005],idx[1005],idy[1005]; 6 int main(...
阅读全文
摘要:codeforces好多这样的想到很简单,想不到感觉难到爆的题目,思维!很简单:只要原序列第k个元素后面有和第k个不一样的就变不了,思考=可以就看第k个前面连续多少个和第k个相同即可= 1 #include 2 #include 3 #include 4 using namespace std; 5...
阅读全文
摘要:n 2 #include 3 #include 4 #include 5 using namespace std; 6 #define LL long long 7 #define MOD 1000000007 8 struct dian{ 9 LL x1,x2,flag;10 };11 que...
阅读全文
摘要:首先所有数最后所变成的数一定是原序列中有的数然后可以将开辟一个新的数组为原数组,并排个序=这样转移方程就比较好想了:dp[i][j]表示原序列中第i个数对应排序后的数组第j个数1 if (i==1&&j==1) dp[i][j]=labs(a[i]-b[j]);2 else if (i==1) dp...
阅读全文