2019.08.18【NOIP提高组】模拟 B 组 贪心+离散+KMP

文章目录

  • 0 能量获取
  • 1 封印一击
  • 2 归途与征程
  • 荣耀永不散场

0 能量获取

“封印大典启动,请出Nescafe魂珠!”随着圣主applepi一声令下,圣剑护法rainbow和魔杖护法freda将Nescafe魂珠放置于封印台上。封印台是一个树形的结构,魂珠放置的位置就是根节点(编号为0)。还有n个其他节点(编号1-n)上放置着封印石,编号为i的封印石需要从魂珠上获取Ei的能量。能量只能沿着树边从魂珠传向封印石,每条边有一个能够传递的能量上限Wi,魂珠的能量是无穷大的。作为封印开始前的准备工作,请你求出最多能满足多少颗封印台的能量需求?

注意:能量可以经过一个节点,不满足它的需求而传向下一个节点。每条边仅能传递一次能量。

对于100%的数据,满足1<=n<=1000,0<=Fi<=n,0<=Ei,Wi<=100


贪心
正确性易证
每次选择需求能量最小的点,判断到根节点的边是否都满足能把该点需求满足,更新答案,路过的边的边权都减一下
假的证明:
如果在该节点的子节点中有更划算的点,那么更划算的点的能量需求一定是更小的(更划算就是指能满足更多的点啊)

#include 
#include 

using namespace std;

int n,ans;
struct cv{
	int f,e,w,h;
}a[1003];
int s[1003];

bool comp(cv a,cv b){
	return a.e

1 封印一击

“圣主applepi于公元2011年9月创造了Nescafe,它在散发了16吃光辉之后与公元2011年11月12日被封印为一颗魂珠,贮藏于Nescafe神塔之中。公元2012年9月,圣主带领四大护法重启了Nescafe,如今已经是Nescafe之魂的第30吃传播了。不久,它就要被第二次封印,而变成一座神杯。。。”applepi思索着Nescafe的历史,准备着第二次封印。

Nescafe由n种元素组成(编号为1~n),第i种元素有一个封印区[ai,bi]。当封印力度E小于ai时,该元素获得ai的封印能量;当封印力度E在ai到bi之间时,该元素将获得E的封印能量;而当封印力度E大于bi时,该元素将被破坏从而不能获得任何封印能量。现在圣主applepi想选择恰当的E,使得封印获得的总能量尽可能高。为了封印的最后一击尽量完美,就请你写个程序帮他计算一下吧!

对于50%的数据,1<=N<=1000,1<=ai<=bi<=10000。

对于100%的数据,1<=N<=105,1<=ai<=bi<=109。


可以看出选择的E一定是在区间右端点的
假的证明:
如果已经选择了一个E且E不在任意区间右端点上,那么E可以移动到离它最近的区间右端点,这样的移动对E原来取得的值不会有减少,因为它没有移出任何一个区间,原来没选到的区间还是选不到;值会增加,因为在区间内的取值是它自己

所以排序一下枚举就好啦
话说这样算是离散(?)

#include 
#include 

using namespace std;

const int N=100005;
int n,c;
long long ans;
long long a[N],b[N],s[N];

void read(){
	scanf("%d",&n);
	for (int i=1;i<=n;i++)
		scanf("%lld%lld",&a[i],&b[i]);
	sort(a+1,a+1+n);
	sort(b+1,b+1+n);
	long long k=1;
	for (int i=n;i>=1;i--) 
		s[i]=s[i+1]+a[i];
	for (int i=1;i<=n;i++){
		while (a[k]<=b[i]&&k<=n) k++;
		long long an=s[k]+(k-i)*b[i]; 
		if (an>ans) ans=an,c=b[i];
	}
}

int main(){
	read();
	printf("%d %lld",c,ans);
}

2 归途与征程

2019.08.18【NOIP提高组】模拟 B 组 贪心+离散+KMP_第1张图片
对于30%的数据,M<=20;

对于80%的测试点,M<=200;

对于100%的测试点,1<=N<=100,1<=M<=100000。



可以根据*的位置把A分成几个字符串,B的循环同构串就把它复制粘贴一遍,这样每个长度为B原长度m的子串都是它的循环同构串

题意就转化为在粘贴后的B中,有多少个长度为m的子串,包含了A转化出的所有子串

欸,一个字符串和多个字符串匹配呢,KMP搞一搞啦

KMP复习:
一个长的串B,判断小的串A是否它的子串,并找出A出现的位置
next[i]:A自匹配,A中以i结尾的非前缀子串,与A前缀匹配长度
f[i]:B中以i开头,与A的匹配长度 或 是否是A的一个匹配 或 其它什么需要的数据

这题
设f[i][j] 表示B中以i开头,是否匹配了A的第j个子串
g[i][j] 表示B中以i开头,最先匹配A的第j个子串的位置
其中f[i][j]可以直接由KMP得
g[i][j] 由f 得
后面就枚举B的循环同构串的开头,看看是否能在m长度内把A的所有子串匹配完
其中A的开头、结尾不是* 的需要特判,必须恰好和所枚举的串头或尾匹配
O ( n m ) O(nm) O(nm)

#include 

using namespace std;

char a[105],b[200006];
int n,m,ans,st,ed,l;
int c[105],g[200005][55];
int f[200005][55],next[106];

void kmp(char a[105],int len,int cd){
	for (int i=2,j=0;i<=n;i++){
		while (j>0&&a[j+1]!=a[i]) j=next[j];
		if (a[j+1]==a[i]) j++;
		next[i]=j;
	}
	for (int i=1,j=0;i0&&(j==n||a[j+1]!=b[i])) j=next[j];
		if (a[j+1]==b[i]) j++;
		if (j==len){
			f[i-len+1][cd]=1;
			j=next[j];
		}
	}
	g[m+1][cd]=m+1;
	for (int i=m;i>=1;i--){
		if (f[i][cd]==1) g[i][cd]=i;
		   else g[i][cd]=g[i+1][cd];
	}
}

void read(){
	char ch=getchar();
	while (ch!='*'&&(ch<'a')||ch>'z') ch=getchar();
	while (ch=='*'||(ch>='a'&&ch<='z')){
		a[++n]=ch;
		ch=getchar();
	}
	while (ch<'a'||ch>'z') ch=getchar();
	while (ch>='a'&&ch<='z'){
		b[++m]=ch;
		ch=getchar();
	}
	int cm=m;
	for (int i=1;i<=cm;i++){
		b[++m]=b[i];
	}
	if (a[1]=='*') st=1;
	if (a[n]=='*') ed=1;
	for (int i=1;i<=n;i++){
		while (a[i]=='*') i++;
		char s[105];
		int k=0;
		l++;
		while (a[i]!='*'&&i<=n){
			s[++k]=a[i];
			i++;
		}
		c[l]=k;
		kmp(s,k,l);
	}
}

int main(){
	read();
	for (int i=1;i<=m/2;i++){
		int x=i,nn=i+m/2,ss=1,ee=l;
		if (st!=1){
			if (f[i][1]==0)	continue;
			x=i+c[1];ss++;
		} 
		if (ed!=1){//&&ss<=l
			if (f[nn-c[l]][l]==0) continue;
			nn-=c[l];ee--;
		}
		for (int j=ss;j<=ee;j++){
			 x=g[x][j];
			 if (x>nn) break;
			 x+=c[j];
		}
		if (x<=nn||ss>ee) ans++;
	}
	printf("%d",ans);
}

荣耀永不散场

注意第三题的题目——归途与征程
这个东西,放到百度搜索,翻到第二页(或者第一页,反正很前面),会有一个标题为“【高乔】归途与征程(1)-折戟沉沙 ” 的东西
你点开它,发现










它是一个全职同人文!!!!主角是乔一帆,第十七届职业联赛后退役,然后重生回第十区开区那天的故事
然后这还是一篇,纯爱??!!!cp是高英杰x乔一帆??!

我,震惊
LOFTER的魔爪已经伸到
我不是不喜欢耽美,只是有点震惊于我搜个信竞题目还会看到LOFTER
【高乔】归途与征程(1)-折戟沉沙 感兴趣的可以点开感受一下
我就不看了哈
哎我还是比较喜欢无cp的全职啦
虽然那么一大帮年轻气盛朝气蓬勃的男孩子们聚在一起这个状况非常诱人
我还是再坚持一下
如果我真香
那就再说吧
哎哎哎刚刚那个文只更了19章呐,写到小乔和叶神一起下冰霜森林副本,感情线几乎还没展开

 、                    、
 、、                 、、
 、、、             、、、
 、、、、          、、、、
 ——————荣耀永不散场——————

你可能感兴趣的:(贪心,离散,KMP,纪中,qzgs)