2 条题解
-
0
这道题是一道模拟,所以……
请看
浅显易懂的代码:#include <bits/stdc++.h> using namespace std; int n /*小张手上的空汽水瓶数*/; int kp /*空汽水瓶数*/, s /*喝的汽水瓶数*/ = 0; int main() { ios::sync_with_stdio(false); cin.tie(0); while (true) { kp = s = 0; // 重置 cin >> n; // 输入 if (n == 0) // 输入 0 break; // 结束 kp = n; // 有 n 个空汽水瓶 while (kp >= 2) // 空汽水瓶数大于等于 2 { if (kp == 2) // 如果空汽水瓶数等于 2 { // 先向老板借 1 个空汽水瓶, // 然后就有了 3 个空汽水瓶, // 可以换 1 瓶汽水, // 喝完后还给老板。 ++s; // 喝了 1 瓶汽水 kp = 0; // 没有空汽水瓶 break; // 结束 } else // 否则空汽水瓶数大于 2 { // 每三个空汽水瓶换一瓶汽水, // 共可以换 kp / 3 瓶汽水, // 剩下 kp % 3 个空汽水瓶。 // 喝完后得到 kp / 3 瓶汽水。 s += kp / 3; // 喝了 kp / 3 瓶 kp = kp % 3 + kp / 3; // 有 kp % 3 + kp / 3 个空汽水瓶 } } cout << s << '\n'; // 输出 } return 0; }
但是这太麻烦了,经过
简单严谨的数学推导:我们可以向老板借瓶子,如果我们拿出 2 个空汽水瓶,再找老板借一个,我们就有了 3 个空汽水瓶,就可以换一瓶汽水了,喝完后再还给老板。也就是说,只要我们有 2 个瓶子就相当于我们能喝 1 瓶汽水。
比如说:
我们有 10 个空汽水瓶,拿出来 2 个,找老板借 1 个,变成 3 个,换 1 瓶汽水,然后喝了还给老板,然后这 2 个空瓶 1 个不剩。 这样我们可以重复 次,每次能喝到 1 瓶汽水,也就是说我们能喝到 5 瓶汽水。 如果有 11 个空汽水瓶,那一定会多出 1 个,不信你可以试试。
推广到一般的形式, 个空汽水瓶恰好能换到 瓶汽水。。
容易写出代码:
#include <bits/stdc++.h> using namespace std; int n; int kp, s = 0; int main() { ios::sync_with_stdio(false); cin.tie(0); while (true) { cin >> n; if (n == 0) break; cout << n / 2 << '\n'; } return 0; }
写了这么多,不点个赞再走吗?(bushi) -
0
C :
#include<stdio.h> int main() { int sum,a,n; while (~scanf("%d",&n)&&n!=0) { sum=0; a=n/3; while (a!=0) { sum+=(n/3); a=n/3; n=n-3*a; n=n+a; } if (n==2) sum++; printf("%d\n",sum); } }
C++ :
#include<iostream> #include<cmath> #include<cstdio> #include<cstdlib> #include<cstring> using namespace std; int main() { int i,m,n=1,j,k=0; while (true) { cin>>n; if (n==0) break; k=0; if (n<3) cout<<"0"; else { k=0; while (true) { j=n/3; k+=j; n=n%3; n+=j; if (n==2) k+=1; if (n<3) break; } cout<<k<<endl; } } return 0; }
- 1
信息
- ID
- 341
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- 10
- 标签
- 递交数
- 3
- 已通过
- 2
- 上传者