noip2005等价表达式13表达式求值

NOIP2013积木大赛 - 模拟 -
NOIP2013积木大赛
【题目描述】
春春幼儿园举办了一年一度的“积木大赛”。今年比赛的内容是搭建一座宽度为n的大厦,大厦可以看成由n块宽度为1的积木组成,第i块积木的最终高度需要是hi。
在搭建开始之前,没有任何积木(可以看成块高度为 0 的积木)。接下来每次操作,小朋友们可以选择一段连续区间[L,R],然后将第L块到第R块之间(含第 L 块和第 R 块)所有积木的高度分别增加1。
小M是个聪明的小朋友,她很快想出了建造大厦的最佳策略,使得建造所需的操作次数最少。但她不是一个勤于动手的孩子,所以想请你帮忙实现这个策略,并求出最少的操作次数。
输入文件为 block.in
输入包含两行,第一行包含一个整数n,表示大厦的宽度。
第二行包含n个整数,第i个整数为hi。
输出文件为 block.out
仅一行,即建造所需的最少操作数。
【输入输出样例】
【样例解释】
其中一种可行的最佳方案,依次选择
【数据范围】
对于 30%的数据,有1 ≤ n ≤ 10;
对于 70%的数据,有1 ≤ n ≤ 1000;
对于 100%的数据,有1 ≤ n ≤
≤ hi ≤ 10000。
#include &iostream&
#include &cstdio&
#include &cstring&
#include &string&
#include &cmath&
#include &algorithm&
int main()
//freopen("block.in","r",stdin);
//freopen("block.out","w",stdout);
int ans=0,
int a[100001];
memset(a,0,sizeof(a));
for(int i=1;i&=n;i++) scanf("%d",&a[i]);
for(int i=1;i&=n;i++)
an=a[i]-a[i-1];
printf("%d",ans);
//system("pause");
1234567891011121314151617181920212223242526272829
#include &iostream&#include &cstdio&#include &cstring&#include &string&#include &cmath&#include &algorithm&using namespace std;int main(){&&&&//freopen("block.in","r",stdin);&&&&//freopen("block.out","w",stdout);&&&&int ans=0,an;&&&&int a[100001];&&&&memset(a,0,sizeof(a));&&&&int n;&&&&cin&&n;&&&&for(int i=1;i&=n;i++) scanf("%d",&a[i]);&&&&for(int i=1;i&=n;i++)&&&&&& {&&&&&&&&&&&&an=a[i]-a[i-1];&&&&&&&&&&&&if(an&0)&&&&&&&&&&&&{&&&&&&&&&&&&ans+=an;&&&&&&&&}&&&&}&&&&printf("%d",ans);&&&&//system("pause");&&&&return 0;}
1984129<FONT face=楷体
"自己选择的路,跪着也要走完"
图包度娘盘340*240(9M) h7wf
WP Cumulus Flash tag cloud by
本站热门201319731954195017811713170916201570154115411480147313661362Myfriends【提问】NOIP201302表达式求值_c++吧_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:250,291贴子:
【提问】NOIP201302表达式求值收藏
给定一个只包含加法和乘法的算术表达式,请你编程计算表达式的值,结果保留末四位。输入:1+1*3+4输出:8我的代码:#include&iostream&long long len,i,t,s;long long a[100000],x;int main(){
equation=equation+&#39;+&#39;;
len=equation.length();
for(i=0;i&i++)
if(equation[i]==&#39;+&#39; || equation[i]==&#39;*&#39;)
if(temp==0) {t++;a[t]=x;x=0;}
else if(temp==1) {a[t]*=x;x=0;}
if(equation[i]==&#39;+&#39;) temp=0;
else if(equation[i]==&#39;*&#39;) temp=1;
else {x*=10;x+=equation[i]-&#39;0&#39;;}
for(i=1;i&=t;i++) s+=a[i];
cout&&s%10000&&}请问各位大神oj上为什么会结果错误?
c++一般需要4-8周,就可以掌握.4个月=两年的工作经验,月薪过万.c++的费用根据培训课时定,免费试听编程课程,名师授课,手把手传教.
数据范围?结果超long long吗?
登录百度帐号推荐应用
为兴趣而生,贴吧更懂你。或【求解】NOIP2013复赛第二题表达式求值问题_noip吧_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:16,536贴子:
【求解】NOIP2013复赛第二题表达式求值问题收藏
不知为什么自己用cena测评时只得了20分,对了两个测试点,错误的数据大多都是负数,还有两个测试点时间超限,可是简单一点的表达式都是正确的,使用样例输入的数据结果也是正确的,不知问题何在,求大神解答,谢谢代码如下:var
shuzi:array [1..100001]
zifu:array [0..100000]
k:array [1..50000]
i,l,n,hehe,j,a,ps:
assign(input,*expr.in*);
reset(input);
assign(output,*expr.out*);
rewrite(output);
zifu[0]:=*+*;
readln(bds);
while bds&&** do
a:=pos(*+*,bds);
ps:=pos(***,bds);
if ((a & ps) or (a=0)) and (ps&&0)
delete(f,a,length(f));
val(f,shuzi[i]);
n:=length(f)+1;
zifu[i]:=bds[n];
delete(bds,1,n);
for j:= 1 to i do
if(zifu[j]=***) and (zifu[j-1]=*+*) then
k[l]:=shuzi[j]*shuzi[j+1];
else if (zifu[j]=***) and (zifu[j-1]=***) then k[l]:=k[l]*shuzi[j+1]
else if zifu[j-1]=*+* then
k[l]:=shuzi[j];
for j:= 1 to l do inc(hehe,k[j]);
hehe:=hehe mod 10000;
writeln(hehe);
close(input);
close(output);end.
全国首家青少儿编程机构,专注于教授8岁~18岁孩子专业编程技能.C/C++,noip竞赛,游戏开发等独创课程,培养兴趣,全面提升能力,超越同龄小伙伴.
缩进自动被百度去掉了,单引号都变成星号了,还是网盘里看吧
你要在计算的同时取模……
要用栈不然应该会超时的
你要在计算的同时取模……孩子。。
登录百度帐号推荐应用
为兴趣而生,贴吧更懂你。或NOIP(30)
#include &cstdio&
#include &cstring&
#include &cstdlib&
#include &stack&
#include &iostream&
using namespace std;
stack&char&
stack&long long&
int main(){
scanf("%s",s);
len=strlen(s)-1;
long long ss=atoi(s),b;
val.push(ss);
for(int i=0;i&=i++){
if(s[i]=='+'){
val.push(atoi(s+i));
st.push(s[i]);
if(s[i]=='*'){
long long top=val.top();val.pop();
long long now=atoi(s+i+1);
now%=10000;
top%=10000;
val.push(now*top);
long long ans(0);
while(!val.empty()){
ans+=val.top();val.pop();
ans%=10000;
printf("%lld",ans%10000);
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:8310次
排名:千里之外
原创:66篇
(51)(13)(1)(2)【NOIP2013普及组P2】表达式求&#20540;
Time Limit:10000MS& Memory Limit:128000K
Total Submit:37 Accepted:19
Case Time Limit:1000MS
Description
Sample Input
Sample Output
中缀表达式求&#20540;——用两个栈 sign[] 和 num[] 分别存储符号和数字。
当读入的字符是数字的时候:
用 tt 表示当前读到的单个数字,则 number = number * 10 &#43; tt
当读入的字符是符号的时候:
1.此时可以保证之前读入的一个完整数字 number 已经可以放入 num 栈当中了, 即 num[&#43;&#43;topn] =number ;并将 number 赋&#20540;为 0 ,便于下次正确读入一个完整数字;
a.)如果当前读到的运算符优先级低于或等于前一个(即 sign 栈顶)运算符优先级,则前面读到的两个数
(num[topn - 1] 和 num[topn])可以进行运算,并把运算后的结果直接替代到 num[topn - 1] ——举个例
子,对于这个式子 3 * 2 &#43; 1 ,当读入到加号的时候便可以把式子从 3 * 2 &#43; 变化为 6 &#43; 了;
b.)如果当前读入的运算符优先级大于之前读入的运算符,则正常压入符号栈 sign 当中;
请注意,当我们这样完整地一边读入一边处理完一个式子之后,此时的简化后的式子一定满足:前面的运算符优先级小于等于后面(即运算符升序排列)——这是因为如果读入时一个式子优先级大于等于后面的运算符,则已经被提前计算并化简成一个数字,比如
3 * 2 &#43; 1 ,在读入加号时便把 3 * 2 化为 6 了。
既然此时的式子满足这样一个顺序(运算符升序排列),我们只要从后往前把式子算一遍就可以得出表达式的&#20540;了。
写到这里,程序框架已经很清晰了;当然,针对于题目而言自然有一些相应的细节。比如,这道题当中只要求输出最后 4 位,所以运算过程当中是可以随时取模 10000(=10^4) 的(实际上也需要这么做,因为尽管每个数不会超过 2^31
- 1 ,但它们的积或和就不一定了,是很有可能爆 long long int 的)。
最后附上代码。
#include &cstdio&
long long int num[100005];
char sign[100005], temp[4];
int lv[100005], signlv[260];
long long int f(char s) {
switch (s) {
case &#39;+&#39;:
return (num[topn] + num[topn + 1]) % 10000;
case &#39;*&#39;:
return (num[topn] * num[topn + 1]) % 10000;
return -1;
return -1;
void init() {
lv[0] = -1;
signlv[&#39;+&#39;] = 1;
signlv[&#39;*&#39;] = 2;
void solve() {
while ((tt = getchar()) != &#39;\n&#39;) {
switch (tt) {
case &#39;+&#39;:
case &#39;*&#39;: {
num[++topn] =
number = 0;
if (lv[tops] & signlv[tt])
num[--topn] = f(sign[tops]);
sign[tops] =
lv[tops] = signlv[tt];
default: {
number = number * 10 + tt - &#39;0&#39;;
num[++topn]=
while (tops)
num[--topn] = f(sign[tops--]);
void output() {
bool flag =
temp[0] = num[1] % 10;
temp[1] = (num[1] /= 10) % 10;
temp[2] = (num[1] /= 10) % 10;
temp[3] = (num[1] /= 10) % 10;
if (!temp[0] && !temp[1] && !temp[2] && !temp[3]) {
putchar(&#39;0&#39;);
putchar(&#39;\n&#39;);
if (temp[3] || flag) {
putchar(temp[3] + &#39;0&#39;);
if (temp[2] || flag) {
putchar(temp[2] + &#39;0&#39;);
if (temp[1] || flag) {
putchar(temp[1] + &#39;0&#39;);
if (temp[0] || flag)
putchar(temp[0] + &#39;0&#39;);
putchar(&#39;\n&#39;);
int main() {
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:405次
排名:千里之外}

我要回帖

更多关于 表达式求值 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信