BestCoder Round #86 HDU 5804(暴力),HDU 5805(前缀和后缀差值最大),HDU 5806(尺取法),HDU 5807(简单DAG 分步式DP )
2016-08-07 15:54
477 查看
传送门:hdu-5804 Price List
求出所有数的和sumsum,如果q
> sumq>sum那么肯定记多了。
时间复杂度O(n)O(n)。
PS:上来没注意long long直接WA一发,同时long long直接cin好像也是不行的,还有就是全局变量sum忘了多组输入初始化了QAQ
求出前ii个数里相邻差值的最大值f_ifi,ii到nn里相邻差值的最大值g_igi,那么ans=\sum_{i=1}^n
\max(|A_{i-1}-A_{i+1}|,f_{i-1},g_{i+1})ans=∑i=1nmax(∣Ai−1−Ai+1∣,fi−1,gi+1)。
时间复杂度O(n)O(n)。
i==1,i==n特判一下就好了
传送门:hdu-5806 NanoApe Loves Sequence Ⅱ
尺取法,先找k个>=m的,定位到t指针。然后移动s,如果a[s]>=m,说明现在区间内不足k个,t指针向后移,补到k个
PS:cin会T,坑惨了_(:зゝ∠)_
做题时一开始想用线段树,思路没打开。。。
传送门:hdu-5807 Keep In Touch
简单的DAG图 初始化将两个城市不能通信的状态值 设为0
考虑dp,设f[i][j][k]f[i][j][k]表示三个人分别在i,j,ki,j,k时的方案数,直接转移是O(n^6)O(n6)的。
于是考虑加维,设f[i][j][k][now]f[i][j][k][now]表示三个人分别在i,j,ki,j,k时,目前准备走nownow这个人的方案数,那么转移复杂度就降低到了O(n^4)O(n4)
总结:整场因为第一题惨WA,导致后面做题心态发生巨大变化,以后要多吸取教训_(:зゝ∠)_
求出所有数的和sumsum,如果q
> sumq>sum那么肯定记多了。
时间复杂度O(n)O(n)。
PS:上来没注意long long直接WA一发,同时long long直接cin好像也是不行的,还有就是全局变量sum忘了多组输入初始化了QAQ
#include<bits/stdc++.h> using namespace std; typedef long long ll; const int inf=0x3f3f3f3f; const int N=100100; int t,n,m; ll sum; char s ; int main(){ scanf("%d",&t); int x; while(t--){ sum=0; scanf("%d%d",&n,&m); for(int i=0; i<n; i++){ scanf("%d",&x); sum+=x; } ll y; for(int i=0; i<m; i++){ scanf("%I64d",&y); if(y>sum)printf("1"); else printf("0"); } printf("\n"); } return 0; }传送门:hdu-5805 NanoApe Loves Sequence
求出前ii个数里相邻差值的最大值f_ifi,ii到nn里相邻差值的最大值g_igi,那么ans=\sum_{i=1}^n
\max(|A_{i-1}-A_{i+1}|,f_{i-1},g_{i+1})ans=∑i=1nmax(∣Ai−1−Ai+1∣,fi−1,gi+1)。
时间复杂度O(n)O(n)。
i==1,i==n特判一下就好了
#include <bits/stdc++.h> #define Memset(x, a) memset(x, a, sizeof(x)) #define ll __int64 using namespace std; const int N=1e5+10; int n,pre ,nex ,a ; int main(){ int t; scanf("%d",&t); while(t--){ Memset(pre,0);Memset(nex,0); scanf("%d",&n); for(int i=1; i<=n; i++)scanf("%d",&a[i]); for(int i=2; i<=n; i++)pre[i]=max(pre[i-1],abs(a[i]-a[i-1])); for(int i=n-1; i>=1; i--)nex[i]=max(nex[i+1],abs(a[i+1]-a[i])); ll ans=0; for(int i=1; i<=n; i++){ if(i==1)ans+=nex[2]; else if(i==n)ans+=pre[n-1]; else ans+=max(max(abs(a[i+1]-a[i-1]),pre[i-1]),nex[i+1]); } printf("%I64d\n",ans); } return 0; }
传送门:hdu-5806 NanoApe Loves Sequence Ⅱ
尺取法,先找k个>=m的,定位到t指针。然后移动s,如果a[s]>=m,说明现在区间内不足k个,t指针向后移,补到k个
PS:cin会T,坑惨了_(:зゝ∠)_
做题时一开始想用线段树,思路没打开。。。
#include <bits/stdc++.h> #define ll __int64 using namespace std; const int N=2e5+10; int a ; int main(){ int t; scanf("%d",&t); while(t--){ int n,m,k; scanf("%d%d%d",&n,&m,&k); for(int i=0; i<n; i++){ scanf("%d",&a[i]); } int s=0,t=0,num=0; ll ans=0; for(;;){ while(t<n&&num<k){ if(a[t++]>=m)num++; } if(num<k)break; ans+=n-t+1; if(a[s++]>=m)num--; } printf("%I64d\n",ans); } return 0; }
传送门:hdu-5807 Keep In Touch
简单的DAG图 初始化将两个城市不能通信的状态值 设为0
考虑dp,设f[i][j][k]f[i][j][k]表示三个人分别在i,j,ki,j,k时的方案数,直接转移是O(n^6)O(n6)的。
于是考虑加维,设f[i][j][k][now]f[i][j][k][now]表示三个人分别在i,j,ki,j,k时,目前准备走nownow这个人的方案数,那么转移复杂度就降低到了O(n^4)O(n4)
#include<bits/stdc++.h> using namespace std; const int N = 55; const int MOD = 998244353; int w ,a ; int f ,g ,h ; int main(){ int T; scanf("%d",&T); while(T--){ int n,m,K,q; int x,y,z; scanf("%d%d%d%d",&n,&m,&K,&q); for(int i = 1; i <= n; ++i) scanf("%d",&w[i]); memset(a,0,sizeof(a)); while(m--){ scanf("%d%d",&x,&y); a[y][x] = 1; } for(int i = n; i >= 1; --i){ for(int j = n; j >= 1; --j){ for(int k = n; k >= 1; --k){ f[i][j][k] = 1; g[i][j][k] = h[i][j][k] = 0; for(int t = 1; t <= n; ++t){ if(a[t][i]) f[i][j][k] = (f[i][j][k]+h[t][j][k])%MOD; } for(int t = 1; t <= n; ++t){ if(a[t][j]) h[i][j][k] = (h[i][j][k]+g[i][t][k])%MOD; } for(int t = 1; t <= n; ++t){ if(a[t][k]) g[i][j][k] = (g[i][j][k]+f[i][j][t])%MOD; } if(abs(w[i]-w[j]) > K || abs(w[i]-w[k]) > K || abs(w[j]-w[k]) > K) f[i][j][k] = 0; } } } while(q--){ scanf("%d%d%d",&x,&y,&z); printf("%d\n",f[x][y][z]); } } return 0; }
总结:整场因为第一题惨WA,导致后面做题心态发生巨大变化,以后要多吸取教训_(:зゝ∠)_
相关文章推荐
- BestCoder Round #86 HDU 5804,HDU 5805,HDU 5806,HDU 5807
- HDU 4681 string 求最长公共子序列的简单DP+暴力枚举
- (hdu step 3.2.1)Max Sum(简单dp:求最大子序列和、起点、终点)
- hdu 1159(Common Subsequence)简单dp,求出最大的公共的字符数
- hdu 1003 hdu1231 简单dp最大子串和
- HDU 1231 最大连续子序列 简单dp
- hdu_2594_求串s1的前缀和串s2后缀最大相同部分
- hdu:5805:前缀和后缀NanoApe Loves Sequence
- Hdu 4561 连续最大积 (dp或暴力)
- hdu 1505 City Game 简单DP 最大子矩阵 迭代法
- hdu 5317 RGCDQ (2015多校第三场第2题)素数打表+前缀和相减求后缀(DP)
- HDU 5442 Favorite Donut(暴力 or 后缀数组 or 最大表示法)
- hdu 1559(简单的dp)最大子矩阵
- hdu 1159(Common Subsequence)简单dp,求出最大的公共的字符数
- HDU 1081 最大子矩阵(LCS_DP+前缀和)
- 【HDU5635 BestCoder Round 74 (div2)A】【贪心 暴力】LCP Array 相邻后缀最大相同前缀 输出字符串方案数
- hdu 5805 D - NanoApe Loves Sequence 记录最大值dp
- hdu 5317 RGCDQ (2015多校第三场第2题)素数打表+前缀和相减求后缀(DP)
- (hdu step 3.2.8)命运(简单DP:求从左上角走到右下角的最大值)
- hdu 1559 最大子矩阵 (简单dp)