https://www.nowcoder.com/test/21283868/summary
思路:递归。
#include<bits/stdc++.h>
using namespace std;
string s;
int len;
string dfs(int &pos)
{
string str="";
while(pos<len)
{
int num=0;
while(pos<len&&s[pos]>='A'&&s[pos]<='Z')
str+=s[pos++];
if(pos<len&&s[pos]=='[')
{
++pos;
while(pos<len&&s[pos]!='|')
{
if(s[pos]>='0'&&s[pos]<='9')
num=num*10+s[pos]-'0';
++pos;
}
++pos;
string tmp=dfs(pos);
while(num--)
str+=tmp;
}
if(s[pos]==']')
{
++pos;
return str;
}
}
return str;
}
int main()
{
getline(cin,s);
len=s.size();
int v=0;
cout<<dfs(v)<<endl;
return 0;
}
思路:单调栈,考虑维护一个单调递减的栈,那么当轮到第 i i i个位置时,显然它向左看最多能看到栈的元素个数栋楼,因此正反处理两边即可得到结果。
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+5;
int a[maxn],ans[maxn];
stack<int> s;
int main()
{
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
int tmp;
for(int i=1;i<=n;i++)
{
ans[i]+=s.size();
while(!s.empty())
{
tmp=s.top();
if(a[i]>=a[tmp])
s.pop();
else
break;
}
s.push(i);
}
while(!s.empty())
s.pop();
for(int i=n;i>=1;i--)
{
ans[i]+=s.size();
while(!s.empty())
{
tmp=s.top();
if(a[i]>=a[tmp])
s.pop();
else
break;
}
s.push(i);
}
while(!s.empty())
s.pop();
for(int i=1;i<=n;i++)
printf("%d ",ans[i]+1);
return 0;
}
思路:不会做,有个题解也没看懂,暴力可拿部分分值,不给代码了。
思路: d p dp dp,设 d p [ i ] [ 0 ] dp[i][0] dp[i][0]表示第 i i i天选择工作或休息的情况下所能忙碌的最大天数, d p [ i ] [ 1 ] dp[i][1] dp[i][1]表示第 i i i天选择健身或休息的情况下所能忙碌的最大天数,转移方程见代码,结果显然为 n − m a x ( d p [ n ] [ 0 ] , d p [ n ] [ 1 ] ) n-max(dp[n][0],dp[n][1]) n−max(dp[n][0],dp[n][1])。
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+5;
int dp[maxn][2],a[maxn],b[maxn];
int main()
{
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
for(int i=1;i<=n;i++)
scanf("%d",&b[i]);
if(a[1])
dp[1][0]=1;
if(b[1])
dp[1][1]=1;
for(int i=2;i<=n;i++)
{
dp[i][0]=dp[i][1]=max(dp[i-1][0],dp[i-1][1]);
if(a[i])
dp[i][0]=max(dp[i][0],max(dp[i-2][0],dp[i-1][1])+1);
if(b[i])
dp[i][1]=max(dp[i][1],max(dp[i-2][1],dp[i-1][0])+1);
}
printf("%d\n",n-max(dp[n][0],dp[n][1]));
return 0;
}
思路:贪心,对守卫按照左端点从小到大排序,假设当前已经覆盖了 [ 0 , p o s ] [0,pos] [0,pos]的区域,那么在原序列中找满足 a [ i ] . l < = p o s a[i].l<=pos a[i].l<=pos情况下的 m a x ( a [ i ] . r ) max(a[i].r) max(a[i].r)进行更新即可。
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+5;
struct node
{
int x,y;
bool operator <(const node &a)const
{
return x<a.x;
}
}a[maxn];
int main()
{
int n,l;
scanf("%d%d",&n,&l);
for(int i=0;i<n;i++)
scanf("%d%d",&a[i].x,&a[i].y);
sort(a,a+n);
int pos=0,ans=0,MAX=-1;
for(int i=0;i<n&&pos<l;)
{
MAX=-1;
while(a[i].x<=pos&&i<n)
MAX=max(MAX,a[i++].y);
if(MAX==-1)
{
ans=-1;
break;
}
++ans,pos=MAX;
}
if(pos<l)
ans=-1;
printf("%d\n",ans);
return 0;
}