#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <string>
using namespace std;
int main()
{
int n,a,b=-1,ans=0,maxn=-10;
scanf("%d",&n);
for(int i=0;i<n;i++)
{
scanf("%d",&a);
if(a>=b)
{
b=a;
ans++;
}
else
{
maxn=max(maxn,ans);
ans=1;
b=a;
}
}
maxn=max(maxn,ans);
printf("%d\n",maxn);
return 0;
}
用优先队列做,先按照m由小到大排序,用优先队列维护m的差值为d的一段
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <string>
#include <vector>
#include <queue>
using namespace std;
#define inf 100005
#define ll __int64
struct node
{
ll m,s;
}e[inf];
struct cmpy
{
bool operator ()(const node n1,const node n2)
{
return n1.m>n2.m;
}
};
bool cmp(node a,node b)
{
return a.m<b.m;
}
int main()
{
int n,d;
scanf("%d%d",&n,&d);
priority_queue<node,vector<node>,cmpy>q;
for(int i=0;i<n;i++)
{
scanf("%I64d%I64d",&e[i].m,&e[i].s);
}
ll ans=0,maxn=-10;
sort(e,e+n,cmp);
q.push(e[0]);
ans=e[0].s;
for(int i=1;i<n;i++)
{
if(e[i].m-q.top().m>=d)
{
maxn=max(ans,maxn);
while(e[i].m-q.top().m>=d && !q.empty())
{
node p=q.top();
q.pop();
ans-=p.s;
}
}
q.push(e[i]);
ans+=e[i].s;
}
maxn=max(maxn,ans);
printf("%I64d\n",maxn);
return 0;
}
搜索
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <string>
#include <vector>
using namespace std;
#define inf 100005
vector<int>vec[inf];
int tree[inf],vis[inf];
int n,k,ans;
void dfs(int u,int t)
{
if(vec[u].size()==1 && vis[vec[u][0]]==1)
{
ans++;
return;
}
vis[u]=1;
int ti;
for(int i=0;i<vec[u].size();i++)
{
int v=vec[u][i];
if(vis[v]==1) continue;
if(tree[v]==0) ti=0;
else ti=t+1;
if(ti>k) continue;
dfs(v,ti);
}
}
int main()
{
memset(tree,0,sizeof(tree));
memset(vis,0,sizeof(vis));
scanf("%d%d",&n,&k);
for(int i=1;i<=n;i++) scanf("%d",&tree[i]);
for(int i=1;i<n;i++)
{
int u,v;
scanf("%d%d",&u,&v);
vec[u].push_back(v);
vec[v].push_back(u);
}
ans=0;
dfs(1,tree[1]);
printf("%d\n",ans);
return 0;
}
状压dp,一共18 道菜,用s(1<<i)表示一种状态
dp[ ss ][ j ] = max(dp[ ss ][ i ]+p[ j ]+vis[ i ][ j ])
i表示这道菜已经吃过了,j表示接下来吃这道菜
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <string>
using namespace std;
#define ll __int64
int p[20],vis[20][20];
ll dp[(1<<18)+5][20];
int main()
{
int n,m,k;
scanf("%d%d%d",&n,&m,&k);
for(int i=0;i<n;i++)
{
scanf("%d",&p[i]);
}
memset(vis,0,sizeof(vis));
for(int i=0;i<k;i++)
{
int a,b;
ll c;
scanf("%d%d%d",&a,&b,&c);
a--,b--;
vis[a][b]=c;
}
for(int i=0;i<n;i++)
{
dp[1<<i][i]=p[i];
}
int oo=1<<n;
ll ans=0;
for(int s=0;s<=oo;s++)
{
int tot=0;
for(int i=0;i<n;i++)
{
if((s&(1<<i))==0) continue;
tot++;
for(int j=0;j<n;j++)
{
if((s&(1<<j))!=0) continue;
int ss=s|(1<<j);
dp[ss][j]=max(dp[ss][j],dp[s][i]+p[j]+vis[i][j]);
}
}
if(tot==m)
{
for(int i=0;i<n;i++)
{
ans=max(ans,dp[s][i]);
}
}
}
printf("%I64d\n",ans);
return 0;
}
【 E. Kefa and Watch】