Daliy Algorithm -- day 102
Nothing to fear
种一棵树最好的时间是十年前,其次是现在!
那些你早出晚归付出的刻苦努力,你不想训练,当你觉的太累了但还是要咬牙坚持的时候,那就是在追逐梦想,不要在意终点有什么,要享受路途的过程,或许你不能成就梦想,但一定会有更伟大的事情随之而来。 mamba out~
2020.8.7
人一我十,人十我百,追逐青春的梦想,怀着自信的心,永不言弃!
合唱队形
关键点在于反向再求一次最长上升子序列,最后比较每个数字 i 从左边到 以 i 为结尾得LIS 和 从右边到以i为结尾得LIS .
ans = min(ans , ans - f[i] - g[i]) + 1;
#include <bits/stdc++.h>
using namespace std;
const int N = 105;
int n;
int h[N];
int f[N] , g[N];
int main()
{
cin >> n;
for(int i = 1;i <= n ;i ++)
cin >> h[i];
for(int i = 1;i <= n;i ++)
{
f[i] = 1;
for(int j = 1;j < i;j ++)
{
if(h[i] > h[j])
f[i] = max(f[i], f[j] + 1);
}
}
for(int i = n;i >= 1;i --)
{
g[i] = 1;
for(int j = i + 1;j <= n;j ++)
{
if(h[i] > h[j])
g[i] = max(g[i] , g[j] + 1);
}
}
int ans = n;
for(int i = 1;i <= n;i ++)
{
ans = min(ans , n - g[i] - f[i]);
}
cout << ans + 1 << endl;
return 0;
}
打印数字三角形
水题
#include <bits/stdc++.h>
using namespace std;
int n;
int main()
{
cin >> n;
int cnt = 1;
for(int i = 1;i <= n;i ++)
{
for(int j = 1;j <= i;j ++){
printf("%4d",cnt++);
}
cout << endl;
}
return 0;
}
开心的金明
#include <bits/stdc++.h>
using namespace std;
const int N = 30005;
const int M = 50;
int v[N] , w[N];
int f[M][N];
int main()
{
int n , m;
cin >> n >> m;
for(int i = 1;i <= m;i ++)
{
cin >> v[i] >> w[i];
}
memset(f , 100000000 , sizeof f);
f[0][0] = 0;
for(int i = 1;i <= m;i ++)
{
for(int j = 0;j <= n;j ++)
f[i][j] = f[i-1][j];
for(int j = v[i];j <= n;j ++)
{
if(j >= v[i])
f[i][j] = max(f[i][j] , f[i-1][j-v[i]] + v[i] * w[i]);
}
}
cout << f[m][n] << endl;
return 0;
}
最大值
线段树板子题
#include <bits/stdc++.h>
#define ls u << 1
#define rs u << 1 | 1
using namespace std;
const int N = 200005;
struct node{
int l , r , val = 0;
}tr[4 * N];
// 向父节点反馈信息
void pushup(int u)
{
tr[u].val = max(tr[ls].val , tr[rs].val);
}
// 建树
void build(int u , int l , int r)
{
tr[u].l = l , tr[u].r = r; // 标注该节点所管辖的区间
if(l == r) return;
int mid = l + r >> 1;
build(ls , l , mid), build(rs , mid + 1 , r);
//pushup(u);
}
// 单点修改
void modify(int u , int x , int v)
{
if(tr[u].l == x && x == tr[u].r)
{
tr[u].val = v;
return;
}
int mid = tr[u].l + tr[u].r >> 1;
if(x <= mid)modify(ls , x , v);
else modify(rs , x , v);
pushup(u);
}
// 区间查询
int query(int u,int l,int r)
{
if(tr[u].l >= l && tr[u].r <= r)return tr[u].val;
int mid = tr[u].l + tr[u].r >> 1;
int val = -1;
if(l <= mid)val = max(val , query(ls , l , r));
if(r > mid) val = max(val , query(rs , l , r));
return val;
}
int main()
{
int m , p , n = 0 ,val = 0;
cin >> m >> p;
build(1 , 1 , m);
for(int i = 0;i < m;i ++)
{
char op;int x;
cin >> op >> x;
if(op == 'A')
{
n++;
modify(1 , n , (x + val) % p);
}else {
val = query(1 , n - x + 1, n);
cout << val << endl;
}
}
return 0;
}