本文题目转载自 :https://blog.csdn.net/qq_45915803/article/details/124637118 题目一: 小团饲养了一小缸鱼,并且买了A、B、C三类饲料来喂养它们,小团的饲养计划如下: —— 在每周一、五、六,喂8粒A类饲料; —— 在每周二、日,喂5颗B类饲料; —— 在每周三、四,喂7颗C类饲料。 假设在某个周一,小团一次性购买了A、B、C三类饲料各a、b、c颗,并在当天开始饲养,请问如果小团按照它的饲养计划进行喂食, 请问这批饲料可以吃多少天(周一当天也算一天)? 样例输入 8 6 6 样例输出 2
分析:
每周一、五、六:喂投8颗A类饲料;
每周二、日:喂投5颗B类饲料;
每周三、四:喂投7颗C类饲料;
由此可得序列:8-5-7-7-8-8-5 该序列每七天一循环。
-8 | -5 | -7 | -7 | -8 | -8 | -5 |
0 | 1 | 2 | 3 | 4 | 5 | 6 |
将该序列存入一数组中,对应下标加一代表其对应每周的哪一天,例如下标为0 则0+1=1代表星期一,-8表示那一天A饲料剩余总值减去8;
[0]-[4]-[5]存储A饲料的剩余数
[1]-[6]存储B饲料的剩余数
[2]-[3]存储C饲料的剩余数
public class TestDemo1 {
//8 5 7 7 8 8 5 为一周期
//标记A饲料为8 B饲料为5 C饲料为7
public static void main(String[] args) {
/**
* 针对条件选择相应的测试用例
*/
int day = days(8,5,7); //3天
int day2 = days(8,6,6); //2天
int day3 = days(8,3,8); //1天
int day4 = days(7,5,7); //0天
int day5 = days(8,5,14); //4天
int day6 = days(16,5,14); //5天
int day7 = days(100,100,100); //28天
int day8 = days(23,65,43); //5天
System.out.println(day);
System.out.println(day2);
System.out.println(day3);
System.out.println(day4);
System.out.println(day5);
System.out.println(day6);
System.out.println(day7);
System.out.println(day8);
}
public static int days(int a, int b, int c) {
if (a < 8) {
return 0;
}
int day = 0;
int[] index = new int[7];
int a1 = a / 8; //计算A饲料一共可以吃多少天
int b1 = b / 5; //计算B饲料一共可以吃多少天
int c1 = c / 7; //计算C饲料一共可以吃多少天
int periodicity = 0; //周期数
while (true){
a1-=3; //计算A饲料一共可以吃多少周
b1-=2; //计算B饲料一共可以吃多少周
c1-=2; //计算C饲料一共可以吃多少周
if (a1<0||b1<0||c1<0){
break;
}
periodicity++; //最后得出一共吃了几个星期
}
index[5] = a; //将A饲料的总数存入index[5]中
index[6] = b; //将B饲料的总数存入index[6]中
index[3] = c; //将C饲料的总数存入index[3]中
for (int j = 0; j <= periodicity; j++) {
for (int i = 0; i < index.length; i++) {
if (i == 0 || i == 4 || i == 5) {
if(i == 4){
index[4] = index[0];
}
if(i == 5){
index[5] = index[4];
}
if(i == 0){
index[0] = index[5];
}
index[i] -= 8;
} else if (i == 1 || i == 6) {
if(i == 1){
index[1] = index[6];
}
if(i == 6){
index[6] = index[1];
}
index[i] -= 5;
} else if (i == 2 || i == 3) {
if(i == 2){
index[2] = index[3];
}
if(i == 3){
index[3] = index[2];
}
index[i] -= 7;
}
if(index[i] < 0){
break;
}
day++;
}
}
return day;
}
}
题目二:
小美得到了一个只包含’0’和’1’两种字符的字符串,现在她可以往这个字符串的任意位置添加任意个字符’1’,请问她至少需要添加多少个字符’1’才能使添加后的字符串是一个回文串? 输入描述 第一行一个整数T,表示有T组数据。 接下来T行,第i行是一个只包含’0’和’1’两种字符的字符串si。 1<=T<=10, 1<=字符串si的长度<=100000 输出描述 T行,每行一个整数,其中第i行表示输入描述中的字符串si至少需要添加多少个字符’1’使其变成回文串。 样例输入 4 10101 00001 01001101 1110 样例输出 0 1 2 3 样例解释 添加的字串用[]示意: 10101=>10101,无需添加即是回文串。 00001=>[1]00001 01001101=>[1]01[1]001101 1110=>1110[1][1][1]
public class TestDemo2 {
public static void main(String[] args) {
//判断回文
/**
* 测试用例
*/
// String str = "101010"; //至少添加1个
// String str = "10101"; //至少添加0个
// String str = "00001"; //至少添加1个
// String str = "001001101"; //至少添加4个 [1]001001101-->[1]0[1]01001101-->[1]0[1][1]01001101-->[1]0[1][1]010[1]01101
// String str = "1110"; //至少添加3个
// String str = "0010"; //至少添加1个
// String str = "01001101"; //至少添加2个
Scanner sc = new Scanner(System.in);
System.out.println("输入要判断的行数:");
int n = sc.nextInt();
for (int i = 1; i <= n; i++) {
System.out.println("请输入字符串:");
add(sc.next());
}
// System.out.println("请输入字符串:");
// String str = sc.nextLine();
// add(str);
}
public static void add(String str){
LinkedList linkedList = new LinkedList();
for (int i = 0; i < str.length(); i++) {
linkedList.add(str.charAt(i));
}
int count = 0;
int i = 0;
int j = linkedList.size()-1;
while (i<=j){
for (i = 0,j = linkedList.size()-1; i < linkedList.size(); i++,j--) {
if(linkedList.get(i)==linkedList.get(j)){
continue;
}else {
if(linkedList.get(j).equals('0')){
linkedList.add(j+1, '1');
count++;
break;
} else if (linkedList.get(i).equals('0')) {
if(i==0){
linkedList.addFirst('1');
}else {
linkedList.add(i,'1');
}
count++;
break;
}
}
}
}
for (int k = 0; k < linkedList.size(); k++) {
System.out.print(linkedList.get(k));
}
System.out.println("至少需要添加"+count+"个1");
}
}
题目三:
时间限制: 3000MS 内存限制: 589824KB 题目描述: 小团在一个无限长的一维坐标轴上玩一个探险游戏,初始时他位于原点,并有k点体力。每往正方向走一格(无法往反方向移动)需要消耗一点体力。要求小团在任何时刻体力都不能小于零。已知坐标轴上有n个坐标上有体力药水,到达这些坐标时,可以恢复一定量的体力。小团想知道,他所能到达的最远坐标是多远?输入描述 第一行两个正整数k、n,分别表示小团初始有k点体力,以及坐标轴上有n个坐标上有体力药水。 接下来一行n个正整数,第i个数xi表示在xi这个坐标上有体力药水。(xi互不相同) 接下来一行n个正整数,第i个数ti表示在xi这个坐标上的体力药水可以恢复ti点体力。 1<=k <=2000000, 1<=n<=20000,1<=xi<=100000000,1<= ti<=10000 输出描述 一行一个正整数,表示小团所能到达的最远坐标。 样例输入 5 2 6 3 1 2 样例输出 8 提示 样例解释1 初始有5点体力,到达坐标3时还剩余2点体力,补充2点,共余4点; 到达坐标6时还剩下1点,补充1点,共余2点; 耗尽体力时处于坐标8。 输入样例2 2 1 2 1 输出样例2 3 样例解释2 初始有2点体力,在坐标2补充1点体力到达坐标3。 输入样例3 2 1 3 1 输出样例3 2 样例解释3 初始有2点体力,到达坐标2耗尽体力停止。
public class TestDemo3 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入初始体力和药水总数:");
int initialValue = sc.nextInt();; //初始体力
int liquidMedicine = sc.nextInt(); //坐标上药水的总数
int[] x = new int[liquidMedicine]; //每瓶药水所在坐标
int[] t = new int[liquidMedicine]; //对应坐标上每瓶药水的恢复体力值
System.out.println("请输入每瓶药水所在坐标:");
for (int i = 0; i < liquidMedicine; i++) {
x[i] = sc.nextInt();
}
System.out.println("请输入对应坐标上每瓶药水的恢复体力值:");
for (int i = 0; i < liquidMedicine; i++) {
t[i] = sc.nextInt();
}
HashMap coord = new HashMap();
if(liquidMedicine>0){
for (int i = 0; i < liquidMedicine; i++) {
coord.put(x[i], t[i]);
}
}
Set set = coord.keySet();
int count=0;
while (initialValue>0){
count++;
for (Integer integer : set) {
if(count==integer){ //到达药水位置
initialValue+=coord.get(integer); //获得体力
}
}
initialValue--;
}
System.out.println(count);
}
}