A.刷题统计
题目:
小明决定从下周一开始努力刷题准备蓝桥杯竞赛。他计划周一至周五每天做 a 道题目,周六和周日每天做 b 道题目。请你帮小明计算,按照计划他将在第几天实现做题数大于等于 n 题?
输入三个数 a,b,n
输出多少天
思路:
首先我们计算他会做多少个整的星期,这需要先计算一整个星期最多能做多少题,也就是5a+2b题,用总数n除5a+2b就能得到,然后乘7就是天数。然后取模就能得到最后一个星期还剩多少题,然后再划分一下,是在前五天还是在后两天。剩下的题对a取模,如果为0就刚好那一天可以做完,有多出来的就需要多做一天,所以就加一。
代码:
点击查看代码
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
long a = scanner.nextLong();
long b = scanner.nextLong();
long n = scanner.nextLong();
long m = n/(5*a+b*2)*7;
n = n%(5*a+b*2);
if(n<=5*a) {
m = m+n/a+1;
if(n%a==0) {
m--;
}
}else if(n>5*a&&n<=5*a+b) {
m = m+6;
}else {
m = m+7;
}
System.out.println(m);
}
}
B.齿轮
题目:
这天,小明在组装齿轮。
他一共有 n 个齿轮,第 i 个齿轮的半径为 ri, 他需要把这 n 个齿轮按一定顺序从左到右组装起来,这样最左边的齿轮转起来之后,可以传递到最右边的齿轮,并且这些齿轮能够起到提升或者降低转速(角速度)的作用。
小明看着这些齿轮,突然有 Q 个疑问: 能否按一定顺序组装这些齿轮使得最右边的齿轮的转速是最左边的齿轮的 qi 倍?
思路:
根据高中物理知识,角速度与半径成反比,且中间的齿轮数都是不需要管的,所以只需要找到成q倍关系的两个数即可,这里我们使用到计数排序,但是java会内存不够,使用C++不会。
代码:
点击查看java代码
import java.util.Arrays;
import java.util.Scanner;
public class Main {
static int[] rec = new int[200005];
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
int Q = scanner.nextInt();
int[] arr = new int[n];
for(int i = 0;i < n;i++) {
arr[i] = scanner.nextInt();
rec[arr[i]]++;
}
Arrays.sort(arr);
while(Q-->0) {
int q = scanner.nextInt();
boolean flag = true;
for(int i = 0;i < n;i++) {
if(arr[i]*q>arr[n-1]) {
break;
}
if(q==1) {
if(rec[arr[i]*q]>=2) {
System.out.println("YES");
flag = false;
break;
}
}else {
if(rec[arr[i]*q]>=1) {
System.out.println("YES");
flag = false;
break;
}
}
if(!flag) {
break;
}
}
if(flag) {
System.out.println("NO");
}
}
}
}
点击查看C++代码
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 2e5+10;
int a[N];
int rec[N];
int main() {
int n , Q;
cin >> n >> Q;
for(int i = 0;i < n;i++){
cin>>a[i];
rec[a[i]]++;
}
sort(a,a+n);
while(Q--){
int q ;
cin >> q;
bool flag = true;
for(int i = 0;i < n;i++) {
if(a[i]*q>a[n-1]) {
break;
}
if(q==1) {
if(rec[a[i]*q]>=2) {
cout<<"YES"<<endl;
flag = false;
break;
}
}else {
if(rec[a[i]*q]>=1) {
cout<<"YES"<<endl;
flag = false;
break;
}
}
if(!flag) {
break;
}
}
if(flag) {
cout<<"NO"<<endl;
}
}
return 0;
}
C.求和
题目:
思路:
将a1...an的和的平方,然后展开就可以得到将所有数相乘,减去平方的数,再除2即可得到该公式的和。
代码:
点击查看代码
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
long s1 = 0;
long s2 = 0;
while(n-->0) {
int a = scanner.nextInt();
s1 += a;
s2 += a*a;
}
long res = (s1*s1-s2)/2;
System.out.println(res);
}
}
D.修剪灌木
题目:
爱丽丝要完成一项修剪灌木的工作。
有 N 棵灌木整齐的从左到右排成一排。爱丽丝在每天傍晩会修剪一棵灌木,让灌木的高度变为 0 厘米。爱丽丝修剪灌木的顺序是从最左侧的灌木开始,每天向右修剪一棵灌木。当修剪了最右侧的灌木后,她会调转方向,下一天开始向左修剪灌木。直到修剪了最左的灌木后再次调转方向。然后如此循环往复。
灌木每天从早上到傍晩会长高 1 厘米, 而其余时间不会长高。在第一天的早晨, 所有灌木的高度都是 0 厘米。爱丽丝想知道每棵灌木最高长到多高。
思路:
这个题目就是求比该树的两边距离的二倍的较大者。还有就是注意是白天长高,傍晚剪。
代码:
点击查看代码
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
int[] arr = new int[n+1];
for(int i = 1;i <= n;i++) {
arr[i] = Math.max((n-i)*2, (i-1)*2);
System.out.println(arr[i]);
}
}
}
F.斐波那契数组
题目:
思路:
根据题意,从前往后改
代码:
点击查看代码
import java.util.Scanner;
public class MainF {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
int[] arr = new int[n];
for(int i = 0;i < n;i++) {
arr[i] = scanner.nextInt();
}
int count = 0;
if(arr[0]!=arr[1]) {
arr[1] = arr[0];
count++;
}
for(int i = 0;i < n-2;i++) {
if(arr[i]+arr[i+1]!=arr[i+2]) {
arr[i+2] = arr[i]+arr[i+1];
count++;
}
}
System.out.println(count);
}
}