NOIP2000普及组 T1计算器的改良

主要考字符串处理,把等式从等号中间断开,左边的区域为left,右边的区域为right。

开四个数组分别用来存储区域left和right中未知数的系数,区域left和right中的常数

先处理区域left,把区域left中含有未知数的数字和常数分别存储进数组,再处理区域right(字符串处理这里省略)

最后把存储区域left和right的未知数系数和常数的数组分别化简(合并同类项),进行平时解方程时候的模拟就好了。

主要看代码理解吧,思路讲的有点抽象了。

 1 var
 2         l_unk,r_unk,l_num,r_num:array[1..255] of longint;  //上面所说的四个数组
 3         top1 ,top2 ,top3 ,top4 :longint;  //四个数组的栈顶
 4         s,str:string;
 5         i,j:longint;
 6         unk:char;  //未知数的符号
 7         mid,last,value:longint;
 8 begin
 9         readln(s);
10         for i:=1 to length(s) do  //处理区域left
11         begin
12                 if s[i] in [‘a‘..‘z‘] then unk:=s[i];  //找出未知数
13                 if s[i]=‘=‘ then mid:=i;  //找出等式中间位置
14         end;
15         if s[length(s)]<>unk then
16                 s:=s+‘+‘;
17         last:=1;
18         for i:=1 to mid do
19         begin
20                 if s[i]=unk then  //如果遇到未知数
21                 begin
22                         str:=copy(s,last,i-last);  //字符串处理
23                         val(str,value);  //字符串转数字
24                         inc(top1);
25                         l_unk[top1]:=value;  //进栈
26                         last:=i+1;
27                 end;
28                 if (not(s[i] in [‘0‘..‘9‘])) and (s[i]<>unk) and (i<>last) then  //如果遇到了常数
29                 begin
30                         str:=copy(s,last,i-last);  //字符串处理
31                         val(str,value);  //转数字
32                         inc(top3);
33                         l_num[top3]:=value;  //进栈
34                         last:=i;
35                 end;
36         end;
37         last:=mid+1;
38         for i:=mid+1 to length(s) do  //处理区域right
39         begin
40                 if s[i]=unk then  //   同上
41                 begin
42                         str:=copy(s,last,i-last);
43                         val(str,value);
44                         inc(top2);
45                         r_unk[top2]:=value;
46                         last:=i+1;
47                 end;
48                 if (not(s[i] in [‘0‘..‘9‘])) and (s[i]<>unk) and (i<>last) then
49                 begin
50                         str:=copy(s,last,i-last);
51                         val(str,value);
52                         inc(top4);
53                         r_num[top4]:=value;
54                         last:=i;
55                 end;
56         end;
57         for i:=top1-1 downto 1 do l_unk[i]:=l_unk[i]+l_unk[i+1];  //化简数组,合并同类项
58         for i:=top2-1 downto 1 do r_unk[i]:=r_unk[i]+r_unk[i+1];
59         for i:=top3-1 downto 1 do l_num[i]:=l_num[i]+l_num[i+1];
60         for i:=top4-1 downto 1 do r_num[i]:=r_num[i]+r_num[i+1];
61         l_unk[1]:=l_unk[1]-r_unk[1];  //解方程,左边未知数系数加上右边未知数的系数的相反数
62         r_num[1]:=r_num[1]-l_num[1];  //解方程,右边常数加上左边常数的相反数
63         writeln(unk,‘=‘,r_num[1]/l_unk[1]:0:3);   //输出保留3位小数
64 end.
时间: 2024-12-13 12:06:51

NOIP2000普及组 T1计算器的改良的相关文章

NOIP2000普及组解题报告

/雾 noip2000发生了什么?为什么洛谷上就一道题- - 计算器的改良 分析:字符串模拟题.记录分别记录等式两边的系数与常数即可.以前在codevs上做过,也就直接把代码贴上来了. #include<iostream> #include<algorithm> #include<cstdio> #include<iomanip> #include<cmath> using namespace std; int main() { char c,l

NOIP2008 普及组T1 ISBN号码 解题报告-S.B.S.

题目描述 每一本正式出版的图书都有一个ISBN号码与之对应,ISBN码包括9位数字.1位识别码和3位分隔符,其规定格式如“x-xxx-xxxxx-x”,其中符号“-”就是分隔符(键盘上的减号),最后一位是识别码,例如0-670-82162-4就是一个标准的ISBN码.ISBN码的首位数字表示书籍的出版语言,例如0代表英语:第一个分隔符“-”之后的三位数字代表出版社,例如670代表维京出版社:第二个分隔符后的五位数字代表该书在该出版社的编号:最后一位为识别码. 识别码的计算方法如下: 首位数字乘以

[NOIP2000] 计算器的改良

47. [NOIP2000] 计算器的改良 ★★   输入文件:computer.in   输出文件:computer.out   简单对比 时间限制:1 s   内存限制:128 MB 问题描述 NCL 是一家专门从事计算器改良与升级的实验室,最近该实验室收到了某公司所委托的一个任务:需要在该公司某型号的计算器上加上解一元一次方程的功能.实验室将这个任务交给了一个刚进入的新手 ZL 先生.为了很好的完成这个任务 ,ZL 先生首先研究了一些一元一次方程的实例: 4+3x=8 6a-5+1=2-2

NOIP普及组2015 T1金币

我对模拟的理解:http://www.cnblogs.com/AKMer/p/9064018.html 题目链接:https://www.luogu.org/problemnew/show/P2669 这是我OI生涯中第一场比赛的第一道题目,而且这题在2015的普及组之前我就做过了(当时教练说NOIP会从NOI题库里选原题就狂刷了一通emmm).只需根据它的题意模拟按阶段发金币,然后特判最后一个阶段是否会全部发完就可以了,水的不能再水.代码如下: 1 #include <cstdio> 2 #

纪中10日T1 2300. 【noip普及组第一题】模板题

2300. [noip普及组第一题]模板题 (File IO): input:template.in output:template.out 时间限制: 1000 ms  空间限制: 262144 KB  具体限制 题目描述 输入 输出 样例输入 样例输出 数据范围限制 朴素算法 考试开始的前一个小时我一直在折腾朴素算法 -> 对拍 1 #pragma GCC optimize(2) 2 #include<bits/stdc++.h> 3 #define IL inline 4 usin

NOIP2008普及组 题解 -SilverN

T1 ISBN号码 题目描述 每一本正式出版的图书都有一个ISBN号码与之对应,ISBN码包括9位数字.1位识别码和3位分隔符, 其规定格式如“x-xxx-xxxxx-x”,其中符号“-”就是分隔符(键盘上的减号),最后一位是识别码,例如0-670-82162-4就是一个标 准的ISBN码.ISBN码的首位数字表示书籍的出版语言,例如0代表英语:第一个分隔符“-”之后的三位数字代表出版社,例如670代表维京出版社:第 二个分隔符后的五位数字代表该书在该出版社的编号:最后一位为识别码. 识别码的计

NOIP2016普及组复赛解题报告

提高组萌新,DAY1DAY2加起来骗分不到300,写写普及组的题目聊以自慰. (附:洛谷题目链接 T1:https://www.luogu.org/problem/show?pid=1909 T2:https://www.luogu.org/problem/show?pid=2010 T3:https://www.luogu.org/problem/show?pid=2058 T4:https://www.luogu.org/problem/show?pid=2119) 不得不说,亲历了14.1

洛谷——普及练习场 普及组选手可冲刺训练,提高组选手亦可在此巩固基础。(Loading...)

简单的模拟 关卡2-1,6 道题 开始普及组的训练!所谓模拟,就是直接根据题意编写,思维难度简单. //T1 铺地毯 #include <cstdio> #define N 10005 int x,y,n,a[N],b[N],g[N],k[N]; int main() { scanf("%d",&n); for(int i=1;i<=n;++i) scanf("%d%d%d%d",&a[i],&b[i],&g[i],

【NOIP2017普及组】赛后心得

我觉得可能今生再也见不到这么简单的题目了--甚至有种能AK的错觉(不 然而考场上脑壳疼了,只剩下310~330. T4告诉我以后遇到不会的东西一定要早点学-- 题目分析 T1 分数 这次连模拟都不用了,干脆叫你输出三个数的和. 要不明年直接改成A+B Problem好了. T2 图书管理员 不难,就是坑,特别坑. 如果有前导零会坑死一堆人,可能很多人没AK不会在T4而是T2(笑). 不过我还是相信CCF不会像kpm一样出前导零. 要是出了我就完了. T3 棋盘 简单到不行啊--直接暴搜一遍即可,