4 条题解
-
6
思路
首先一定要开数组存胜负
因为你不仅要存胜负的场数,还要存胜负的顺序,以此来排分数。
玩过乒乓球大部分人都知道,正规乒乓球比赛,不仅分数要大于11(或21),两者分数相差也要大于2。
如果比赛分数达到11-10,比赛会继续。直到一个人比另外一个人多两分。
21分制同理
我是把输入、11分制、21分制一起记录,毕竟一个函数。只开了一个数组。初始值为0(开全局变量),当录到W赋值1(胜),录到L赋值2(负)。方便下面取用。
取用时,读到1,胜数++,读到二,负数++,按照上文判定来输出,读到0,表明记录结束了,输出之前剩余的分数即可。
简洁版:
- 要么一次性读取数据后面再慢慢判断
- 要么边输入边判断两种情况,不过答案要先存起来
AC代码
#include<bits/stdc++.h> using namespace std; char str[1000001], a; int cnt=0; void ccl(int n) { int a=0,b=0; for(int i=1;i<=cnt;i++) { if(str[i]=='W') { a++; } if(str[i]=='L') { b++; } if((a>=n||b>=n)&&abs(a-b)>=2) { cout<<a<<":"<<b<<endl; a=b=0; } } cout<<a<<":"<<b<<endl; return; } int main() { while(cin>>a&&a!='E') { if(a=='W'||a=='L') { cnt++; str[cnt]=a; } } ccl(11); cout<<endl; ccl(21); return 0; }
-
1
题解
这道题也是模拟,我们可以在输入时模拟进球比分,在比分满足条件(这里吐槽一下,题目里也没说清楚,是在一方分且分差分才下一局)时因为输出格式的要求,加入vector。 最后遍历vector输出就可以了:
#include <bits/stdc++.h> using namespace std; int W1, L1, W2, L2; char ch; vector<int> c1, c2, c3, c4; int main() { do // 我这里用了do-while { ch = getchar(); // scanf("%c", &ch); if (ch == 'W') { // 11分和21分都++ W1++; W2++; } if (ch == 'L') { L1++; L2++; } if ((W1 >= 11 || L1 >= 11) && abs(W1 - L1) >= 2) { c1.push_back(W1); c2.push_back(L1); W1 = 0; // 记得归0 L1 = 0; } if ((W2 >= 21 || L2 >= 21) && abs(W2 - L2) >= 2) { c3.push_back(W2); c4.push_back(L2); W2 = 0; L2 = 0; } } while (ch != 'E'); // 注意分号 // 按格式输出 for (int i = 0; i < c1.size(); i++) { printf("%d:%d\n", c1[i], c2[i]); } printf("\n"); for (int i = 0; i < c3.size(); i++) { printf("%d:%d\n", c3[i], c4[i]); } return 0; }
然后…………
恭喜您获得0分的好成绩! 我们观察一下,会发现只有在循环中完成一局才会push_back,但是如果结束了而不满一局,则不会加到vector中。我们补上:
#include <bits/stdc++.h> using namespace std; int W1, L1, W2, L2; char ch; vector<int> c1, c2, c3, c4; int main() { do { ch = getchar(); // scanf("%c", &ch); if (ch == 'W') { W1++; W2++; } if (ch == 'L') { L1++; L2++; } if ((W1 >= 11 || L1 >= 11) && abs(W1 - L1) >= 2) { c1.push_back(W1); c2.push_back(L1); W1 = 0; L1 = 0; } if ((W2 >= 21 || L2 >= 21) && abs(W2 - L2) >= 2) { c3.push_back(W2); c4.push_back(L2); W2 = 0; L2 = 0; } } while (ch != 'E'); // ; // 增加尾分 c1.push_back(W1); c2.push_back(L1); c3.push_back(W2); c4.push_back(L2); for (int i = 0; i < c1.size(); i++) { printf("%d:%d\n", c1[i], c2[i]); } printf("\n"); for (int i = 0; i < c3.size(); i++) { printf("%d:%d\n", c3[i], c4[i]); } return 0; }
0分和100分的差距~
#include <bits/stdc++.h> using namespace std; int W1, L1, W2, L2; char ch; vector<int> c1, c2, c3, c4; int main() { do { ch = getchar(); // scanf("%c", &ch); if (ch == 'W') { W1++; W2++; } if (ch == 'L') { L1++; L2++; } if ((W1 >= 11 || L1 >= 11) && abs(W1 - L1) >= 2) { c1.push_back(W1); c2.push_back(L1); W1 = 0; L1 = 0; } if ((W2 >= 21 || L2 >= 21) && abs(W2 - L2) >= 2) { c3.push_back(W2); c4.push_back(L2); W2 = 0; L2 = 0; } } while (ch != 'E'); c1.push_back(W1); c2.push_back(L1); c3.push_back(W2); c4.push_back(L2); for (int i = 0; i < c1.size(); i++) { printf("%d:%d\n", c1[i], c2[i]); } printf("\n"); for (int i = 0; i < c3.size(); i++) { printf("%d:%d\n", c3[i], c4[i]); } return 0; }
-
1
下面发一个我做的代码吧。个人感觉思路很明确。看一遍基本上就懂了(吧?)
首先一定要开数组存胜负
因为你不仅要存胜负的场数,还要存胜负的顺序,以此来排分数。
其次分数差要大于2。
玩过乒乓球大部分人都知道,正规乒乓球比赛,不仅分数要大于11(或21),两者分数相差也要大于2。如果比赛分数达到11-10,比赛会继续。直到一个人比另外一个人多两分。(如13-11)
21分制同理
搞完这些重点说思路
我的思路没有DALAO们这么~复杂~优秀。我是把输入、11分制、21分制分而治之。只开了一个数组。初始值为0(开全局变量),当录到W赋值1(胜),录到L赋值2(负)。方便下面取用。
取用时,读到1,胜数++,读到二,负数++,按照上文判定来输出,读到0,表明记录结束了,输出之前剩余的分数即可。
下面是本蒟蒻的代码
`
//stone_juice石汁 P1042 乒乓球 #include <iostream> #include <cstring> using namespace std; int win[62503]; int w,l; int main() { char s; for(int i=1;cin>>s&&s!='E';i++)//循环读入,当读到字符E结束 { if(s=='W')win[i]=1; else win[i]=2; } //----------------11分制 ---------------- for(int i=1;1;i++) { if(win[i]==1)w++;//胜场+1 if(win[i]==2)l++;//负场+1 if(win[i]==0)//读到0则记录结束,输出记录结束前的分数。 { cout<<w<<":"<<l<<endl<<endl; break; } if(w-l>=2||l-w>=2) if(w>=11||l>=11)//当双方比分相差大于2且一方分数大等于11输出 { cout<<w<<":"<<l<<endl; w=0;//比分清零 l=0; } } w=0;//清零,为21分制计算做准备 l=0; //----------------21分制 ---------------- for(int i=1;1;i++)//一切同上,唯一区别就是判定从11变为21 { if(win[i]==1)w++; if(win[i]==2)l++; if(win[i]==0) { cout<<w<<":"<<l; break; } if(w-l>=2||l-w>=2) if(w>=21||l>=21)//11变为21 { cout<<w<<":"<<l<<endl; w=0; l=0; } } return 0;//华丽地结束 ㄟ(▔▽▔)ㄏ }
-
0
本题很简单,只需简单模拟一下即可
虽然本蒟蒻的代码有亿些复杂这题只需注意一点:
直到分差大于或者等于 2,才一局结束。
所以本蒟蒻代码如下
#include <bits/stdc++.h> using namespace std; string str; char ch , tmp; int W , L , i; //W:华华分数 L:华华对手分数 int main(){ ch = tmp;//清空ch while(ch != 'E'){//11分制 ch = getchar();//读入ch if(ch == 'W')//若为'W',W++ W++; if(ch == 'L')//若为'L',L++ L++; str += ch; //将输入的ch存入str中,方便记录21分制 if((W >= 11 || L >= 11) && abs(W - L) >= 2){ //若华华或华华对手高于11分并且分差大于2分,结束本局比赛 cout << W << ':' << L << '\n'; W = 0 , L = 0; //输出比分并将比分清零 } } cout << W << ':' << L << '\n'; W = 0 , L = 0; //输出最后比分 cout << '\n';//换行 //21分制与11分制类似 ch = tmp;//清空ch while(ch != 'E'){ ch = str[i++]; if(ch == 'W') W++; if(ch == 'L') L++; if((W >= 21 || L >= 21) && abs(W - L) >= 2){ cout << W << ':' << L << '\n'; W = 0 , L = 0; } } cout << W << ':' << L; return 0; }
- 1
信息
- ID
- 1724
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 5
- 标签
- 递交数
- 234
- 已通过
- 85
- 上传者