2010-1128
从 Trac 迁移的文章
这是从旧校内 Wiki 迁移的文章,可能存在一些样式问题,您可以向 memset0 反馈。
原文章内容如下:
'''题目描述:'''[[BR]]
幽幽子和妖梦要开个hanami party,妖梦她每天能干两件事,1.练级——等级L++,2.做菜——做L个菜。但幽幽子每天都需要吃a[i]个菜。问在满足幽幽子每天都有足够的菜吃的情况下,n天后能有多少个菜。[[BR]]
'''解题方法:'''[[BR]]
首先如果练级的话,越早练越好。[[BR]]
于是我们可以让她在满足条件的情况下尽量练级。[[BR]]
然后从最后一次练级开始往前推,一个一个把练级改为做菜,每一次改变都会增加做菜量,直到有一天改变之后,做菜总量减少为止。[[BR]]
这时的做菜总量就是最大的做菜总量。[[BR]]
下面是作者猛犸也钻地的标程[[BR]]
{{{
#!cpp
#include <cstdio>
#include <stack>
using namespace std;
int main(){
int n, l, v;
while (scanf("%d%d", &n, &l) > 0){
long long a[100001], s = 0;
stack <int> q;
a[0] = 0;
for (int i = 1; i <= n; i++){
scanf("%d", &v);
a[i] = a[i - 1] + v;
}
for (int i = 1; i <= n; i++){
q.push(i);
while(!q.empty() && (s < a[i] || i == n)){
v = (l + q.size() - 1) - (i - q.top());
if(v <= 0)
break;
else
s += v;
q.pop();
}
if (s < a[i])
break;
}
if (s < a[n])
printf("Myon\n");
else
printf("%lld\n", s - a[n]);
}
}
}}}
用了一个栈来记录那些日子用来练级,这样处理起来就很方便。
题目描述:
幽幽子和妖梦要开个hanami party,妖梦她每天能干两件事,1.练级——等级L++,2.做菜——做L个菜。但幽幽子每天都需要吃a[i]个菜。问在满足幽幽子每天都有足够的菜吃的情况下,n天后能有多少个菜。
解题方法:
首先如果练级的话,越早练越好。
于是我们可以让她在满足条件的情况下尽量练级。
然后从最后一次练级开始往前推,一个一个把练级改为做菜,每一次改变都会增加做菜量,直到有一天改变之后,做菜总量减少为止。
这时的做菜总量就是最大的做菜总量。
下面是作者猛犸也钻地的标程
#include <cstdio>
#include <stack>
using namespace std;
int main(){
int n, l, v;
while (scanf("%d%d", &n, &l) > 0){
long long a[100001], s = 0;
stack <int> q;
a[0] = 0;
for (int i = 1; i <= n; i++){
scanf("%d", &v);
a[i] = a[i - 1] + v;
}
for (int i = 1; i <= n; i++){
q.push(i);
while(!q.empty() && (s < a[i] || i == n)){
v = (l + q.size() - 1) - (i - q.top());
if(v <= 0)
break;
else
s += v;
q.pop();
}
if (s < a[i])
break;
}
if (s < a[n])
printf("Myon\n");
else
printf("%lld\n", s - a[n]);
}
}
用了一个栈来记录那些日子用来练级,这样处理起来就很方便。