标签:Again Great ch Fence int read fg getchar define
题目链接:传送门
思路:
仔细想一下可以发现:每个位置最多就增加2个高度。
所以就可以有状态:
f[i][j]表示保证前i个篱笆都是great时,第i个篱笆增加j的高度所需要的最小花费(1 <= i <= n, 0 <= j <= 2)。总共有3n个状态。
如果i = 1,f[i][j] = a[1] * j;
如果i > 1, f[i][j] = min{f[i-1][k] | 0 <= k <= 2 && a[i]+j != a[i-1]+k};这里的“a[i]+j != a[i-1]+k”保证了篱笆都是great的。
答案ans = min{f[n][j] | 0 <= j <= 2}
时间复杂度是O(n)的。
代码:O(n)
#include <bits/stdc++.h> #define fast ios::sync_with_stdio(false), cin.tie(0), cout.tie(0) #define N 300005 #define M 100005 #define INF 0x3f3f3f3f #define mk(x) (1<<x) // be conscious if mask x exceeds int #define sz(x) ((int)x.size()) #define lson(x) (x<<1) #define rson(x) (x<<1|1) #define mp(a,b) make_pair(a, b) #define endl '\n' #define lowbit(x) (x&-x) using namespace std; typedef long long ll; typedef double db; /** fast read **/ template <typename T> inline void read(T &x) { x = 0; T fg = 1; char ch = getchar(); while (!isdigit(ch)) { if (ch == '-') fg = -1; ch = getchar(); } while (isdigit(ch)) x = x*10+ch-'0', ch = getchar(); x = fg * x; } template <typename T, typename... Args> inline void read(T &x, Args &... args) { read(x), read(args...); } ll a[N], b[N]; ll f[N][3]; int main() { int q; cin >> q; while (q--) { int n; cin >> n; for (int i = 1; i <= n; i++) { read(a[i], b[i]); memset(f[i], 0x3f, sizeof(f[i])); } memset(f[0], 0, sizeof(f[0])); for (int i = 1; i <= n; i++) { for (int j = 0; j < 3; j++) { for (int k = 0; k < 3; k++) if (a[i-1]+j != a[i]+k) { f[i][k] = min(f[i][k], f[i-1][j] + k*b[i]); } } } ll ans = 2e18; for (int i = 0; i < 3; i++) { ans = min(ans, f[n][i]); } cout << ans << endl; } return 0; }View Code
标签:Again,Great,ch,Fence,int,read,fg,getchar,define 来源: https://www.cnblogs.com/Lubixiaosi-Zhaocao/p/11623449.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。