AlenaNuna

导航

HJ98 自动售货系统

题目:https://www.nowcoder.com/practice/cd82dc8a4727404ca5d32fcb487c50bf?tpId=37&tqId=21321&rp=1&ru=/exam/oj/ta&qru=/exam/oj/ta&sourceUrl=%2Fexam%2Foj%2Fta%3FtpId%3D37&difficulty=undefined&judgeStatus=undefined&tags=&title=

题意就是编写一个自动售货机的系统,能够完成一些基本的操作。难点主要在于处理读入和码量。

不是,哥们,好大一坨模拟啊= =

我足足写了267行= =

不过倒是很好调。。虽然难度标着“困难”,感觉也就只有码量是“困难”的,别的都挺好处理的。

  1 #include<bits/stdc++.h>
  2 using namespace std;
  3 char c,cML;
  4 int SPshu[7],zhangshu[5],Toubi,sum=0;
  5 int SPjia[7],Tuibi[5],Q,mz[5],f;
  6 struct SP{
  7     int shu,id;
  8 }sp[7];
  9 bool cmp(const SP&a,const SP&b){
 10     if(a.shu>b.shu)return 1;
 11     if(a.shu<b.shu)return 0;
 12     return a.id<b.id;
 13 }
 14 void InputR(){
 15     c=getchar();
 16     c=getchar();
 17     int cnt=0;
 18     while(1){
 19         int x=0;
 20         while(c!='-'&&c!=' '){
 21             x=x*10+c-'0';
 22             c=getchar();
 23         }
 24         SPshu[++cnt]=x;
 25         if(c!=' ') c=getchar();
 26         else break;
 27     }
 28     c=getchar();
 29     cnt=0;
 30     while(1){
 31         int x=0;
 32         while(c!='-'&&c!=';'){
 33             x=x*10+c-'0';
 34             c=getchar();
 35         }
 36         zhangshu[++cnt]=x;
 37         if(c!=';') c=getchar();
 38         else break;
 39     }
 40     return;
 41 }
 42 void OutputR(){
 43     puts("S001:Initialization is successful");
 44     return;
 45 }
 46 void InputP(){
 47     c=getchar();
 48     c=getchar();
 49     int x=0;
 50     while(c!=';'){
 51         x=x*10+c-'0';
 52         c=getchar();
 53     }
 54     Toubi=x;
 55     return;
 56 }
 57 void OutputP(int x){
 58     if(x==2){
 59         puts("E002:Denomination error");
 60         return;
 61     }
 62     if(x==3){
 63         puts("E003:Change is not enough, pay fail");
 64         return;
 65     }
 66     if(x==5){
 67         puts("E005:All the goods sold out");
 68         return;
 69     }
 70     if(x==6){
 71         printf("S002:Pay success,balance=%d\n",sum);
 72         return;
 73     }
 74     return;
 75 }
 76 void WorkP(){
 77     if(Toubi!=1&&Toubi!=2
 78     &&Toubi!=5&&Toubi!=10){
 79         OutputP(2);
 80         return;
 81     }
 82     if(Toubi==5||Toubi==10){
 83         if(zhangshu[1]+2*zhangshu[2]<Toubi){
 84             OutputP(3);
 85             return;
 86         }
 87     }
 88     bool f=0;
 89     for(int i=1;i<=6;i++)
 90         if(SPshu[i]>0) f=1;
 91     if(f==0){
 92         OutputP(5);
 93         return;
 94     }
 95     sum+=Toubi;
 96     if(Toubi==1||Toubi==2) zhangshu[Toubi]++;
 97     if(Toubi==5) zhangshu[3]++;
 98     if(Toubi==10) zhangshu[4]++;
 99     OutputP(6);
100     return;
101 }
102 void OutputB(int x){
103     if(x==6){
104         puts("E006:Goods does not exist");
105         return;
106     }
107     if(x==7){
108         puts("E007:The goods sold out");
109         return;
110     }
111     if(x==8){
112         puts("E008:Lack of balance");
113         return;
114     }
115     if(x==3){
116         printf("S003:Buy success,balance=%d\n",sum);
117         return;
118     }
119     return;
120 }
121 void WorkB(int x){
122     if(x<1||x>6){
123         OutputB(6);
124         return;
125     }
126     if(SPshu[x]==0){
127         OutputB(7);
128         return;
129     }
130     if(sum<SPjia[x]){
131         OutputB(8);
132         return;
133     }
134     sum-=SPjia[x];
135     OutputB(3);
136     return;
137 }
138 void InputB(){
139     c=getchar();
140     c=getchar();
141     c=getchar();
142     int x=c-'0';
143     WorkB(x);
144     c=getchar();
145     return;
146 }
147 void OutputC(int x){
148     if(x==9){
149         puts("E009:Work failure");
150         return;
151     }
152     if(x==1){
153         for(int i=1;i<=4;i++){
154             printf("%d yuan coin number=%d\n",mz[i],Tuibi[i]);
155         }
156     }
157     return;
158 }
159 void WorkTuibi(int x){
160     if(sum>=zhangshu[x]*mz[x]){
161         sum-=zhangshu[x]*mz[x];
162         Tuibi[x]=zhangshu[x];
163         zhangshu[x]=0;
164     }
165     else {
166         Tuibi[x]=sum/mz[x];
167         zhangshu[x]-=Tuibi[x];
168         sum-=Tuibi[x]*mz[x];
169     }
170     return;
171 }
172 void WorkC(){
173     if(sum==0) {
174         OutputC(9);
175         return;
176     }
177     for(int i=4;i>=1;i--)
178         WorkTuibi(i);
179     OutputC(1);
180     return;
181 }
182 void InputQ(){
183     c=getchar();
184     c=getchar();
185 //    while(c<'0'||c>'9')c=getchar();
186     int x=0;
187     f=0;
188     while(c>='0'&&c<='9'){
189         f=1;
190         x=x*10+c-'0';
191         c=getchar();
192     }
193     Q=x;
194     return;
195 }
196 void OutputQ(int x){
197     if(x==10){
198         puts("E010:Parameter error");
199         return;
200     }
201     if(x==0){
202         for(int i=1;i<=6;i++){
203             printf("A%d %d %d\n",sp[i].id,SPjia[sp[i].id],sp[i].shu);
204         }
205         return;
206     }
207     if(x==1){
208         for(int i=1;i<=4;i++){
209             printf("%d yuan coin number=%d\n",mz[i],zhangshu[i]);
210         }
211         return;
212     }
213     return;
214 }
215 void WorkQ(){
216     if((Q!=0&&Q!=1)||(!f)){
217         OutputQ(10);
218         return;
219     }
220     if(Q==0){
221         for(int i=1;i<=6;i++){
222             sp[i].id=i;
223             sp[i].shu=SPshu[i];
224         }
225         sort(sp+1,sp+6+1,cmp);
226         OutputQ(0);
227         return;
228     }
229     else{
230         OutputQ(1);
231         return;
232     }
233     return;
234 }
235 void init(){
236     mz[1]=1; mz[2]=2; mz[3]=5; mz[4]=10;
237     SPjia[1]=2;SPjia[2]=3;SPjia[3]=4;
238     SPjia[4]=5;SPjia[5]=8;SPjia[6]=6;
239     cML=getchar();
240     while(cML!=EOF){
241         if(cML=='r'){
242             InputR();
243             OutputR();
244         }
245         if(cML=='p'){
246             InputP();
247             WorkP();
248         }
249         if(cML=='b'){
250             InputB();
251         }
252         if(cML=='c'){
253             c=getchar();
254             WorkC();
255         }
256         if(cML=='q'){
257             InputQ();
258             WorkQ();
259         }
260         cML=getchar();
261     }
262     return;
263 }
264 int main(){
265     init();
266     return 0;
267 }

 到此为止华为机试题库里的“较难”和“困难”题都被我写完了。接下来挑一些中等题写写,如果实在太容易我就去写leetcode hot100,据说挺常考的。

posted on 2024-09-05 15:08  AlenaNuna  阅读(24)  评论(0编辑  收藏  举报