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;
}
posted @ 2020-08-07 22:18  _starsky  阅读(104)  评论(0编辑  收藏  举报