本题将会给出
组测试数据,确切数字未知,您需要一直读入直到特定的结尾;您也可以参考 牛客网在线判题系统使用帮助 获得更多的使用帮助。每组测试数据描述如下:
在一行上输入一个整数
,代表小张手上的空汽水瓶数量。特别地,
代表输入结束,您只需要立即退出,不需要针对这种情况进行处理。
对于每一组测试数据,新起一行。输出一个整数,代表小张最多可以喝到的汽水数量。
3 10 81 0
1 5 40
对于第一组测试数据,共有
个空瓶,可以换
瓶汽水。可以证明无法再做任何兑换,因此最多可以喝到
瓶汽水。
对于第二组测试数据:
第一轮兑换,共有
个空瓶。可以换
瓶汽水,余下
个空瓶;
第二轮兑换,刚刚余下
个空瓶、加上刚刚兑换的
瓶汽水喝完,共有
个空瓶。可以换
瓶汽水,余下
个空瓶;
第三轮兑换,刚刚余下
个空瓶、加上刚刚兑换的
瓶汽水喝完、再找老板借
个空瓶,共有
个空瓶。可以换
瓶汽水,余下
个空瓶。喝完之后不要忘记归还借的空瓶。
综上,一共可以喝到
瓶汽水。
#include <iostream>using namespace std;intmain(){intn;while(cin>>n){cout<<n/2<<endl;}}
/*
递归问题
3个瓶子换1瓶水+1个空瓶子,两个瓶子换1瓶水+0个空瓶子,1个瓶子换0瓶水。
f(1) = 0
f(2) = 1
f(3) = 1
f(4) = f(2)+1 //4个瓶子,其中3个可以换1瓶水+1个空瓶,所以是f(2)+1
f(5) = f(3)+1 //3个瓶子换1瓶水+1个空瓶,所以是f(3)+1
...
f(n) = f(n-2)+1 */
#include <iostream>
using namespace std;
int f(int n)
{
if(n==1) return 0;
if(n==2) return 1;
return f(n-2)+1;
}
int main()
{
int n;
while(cin >> n){
if(n==0)
break;
cout<<f(n)<<endl;
}
return 0;
}
// f(n)=n/3 + f(n%3+n/3),貌似递归次数更少。
// n/3是能直接换到的汽水数,n%3+n/3是新换到的汽水瓶子+上次换剩下的
import java.util.*;
public class Main {
public static int f(int n) {
if (n == 1)
return 0;
if (n == 2)
return 1;
return n / 3 + f(n % 3 + n / 3);
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc = new Scanner(System.in);
while (sc.hasNext()) {
int num = sc.nextInt();
if (num != 0) {
System.out.println(f(num));
}
}
sc.close();
}
}
//递归方法
import java.util.*;
public class Main{
public static void main(String[] args){
Scanner sc=new Scanner(System.in);
int n;
while(sc.hasNext())
{
n=sc.nextInt();
System.out.println(Drink(n));
}
}
public static int Drink(int n)
{
if(n<=0)
return 0;
else if(n==3)
return 1;
else if(n==2)
return 1;
else//此时表明对应为3的倍数,递归
{
int h=0;
h=n/3;
return h+Drink(n-3*h+h);
}
}
}
#include<iostream>
using namespace std;
int main(){
int n;
while(cin>>n){
if(n == 0) break;
//正常的解法
/*int ret = 0;
int a, b;
while(n >= 3){
a = n/3;
b = n%3;
ret += a;
n = a + b;
}
if(n == 2) ret += 1;
cout<<ret<<endl;*/
//从给的样例中可以观察出来的规律
cout<<n/2<<endl;
}
return 0;
}
import java.util.Scanner;
public class Main {
private static int blank;
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
while (scan.hasNext()) {
blank = scan.nextInt();
int drink = 0;
int remain;
if (blank > 0 && blank <= 100) {
if (blank == 1) {
drink = 0;
} else if (blank == 2) {
drink = 1;
}
while (blank > 2) { //10,4,5
drink += blank / 3; //3 drink,4 drink
remain = blank % 3; //1 remain,1 remain
blank = blank / 3 + remain; //4 blank,2 blank
if (blank == 2) {
drink++;
}
}
}
System.out.println(drink + "");
}
}
}
import numpy
if __name__ == '__main__':
print('Start!')
n = int(input())
m = 0
if n < 2:
print('You get no reward bottle!')
elif n == 2:
print('You get 1 bottle!')
else:
while n>2:
m = m + n//3
n = n//3 + n%3
if n == 2:
print('You get ', m + 1, ' bottle!')
else:
print('You get ', m, ' bottle!') # python3 import sys def drink(n): if n <2: return 0 elif n==2: return 1 # 喝过的汽水数 -> n//3 # 剩下的空瓶数 -> n//3 + n%3 return n//3+drink(n//3+n%3) for line in sys.stdin: n = int(line.strip()) res =0 res =drink(n) print(res)
# 方法一:常规方法 for i in range(10): a, s = int(input()), 0 while True: if a < 2: # 小于2瓶,则不够兑换 break elif a == 2: # 等于两瓶,可以就借一瓶,然后归还 s += 1 break else: # 其他则正常处理 n, m = a // 3, a % 3 s += n a = n + m print(s) # 方法二:每两瓶借一瓶,然后归还,即喝一瓶,又没有剩余瓶子,而不足两瓶的也无法兑换 for i in range(10): a = int(input()) if a == 0: break else: print(a // 2)