算算算
洛谷
Day1 P1909 [NOIP2016 普及组] 买铅笔
题目描述
P 老师需要去商店买 n 支铅笔作为小朋友们参加 NOIP 的礼物。她发现商店一共有 33 种包装的铅笔,不同包装内的铅笔数量有可能不同,价格也有可能不同。为了公平起 见,P 老师决定只买同一种包装的铅笔。
商店不允许将铅笔的包装拆开,因此 P 老师可能需要购买超过 n 支铅笔才够给小朋友们发礼物。
现在 P 老师想知道,在商店每种包装的数量都足够的情况下,要买够至少 n 支铅笔最少需要花费多少钱。
输入格式
第一行包含一个正整数 n*,表示需要的铅笔数量。
接下来三行,每行用 22 个正整数描述一种包装的铅笔:其中第 11 个整数表示这种包装内铅笔的数量,第 22 个整数表示这种包装的价格。
保证所有的 77 个数都是不超过 1000010000 的正整数。
输出格式
1 个整数,表示 P 老师最少需要花费的钱。
简单的数学思路 虽然我数学也不是很好就是了 笑
import java.util.Arrays;
import java.util.Scanner;
public class Main{
public static void main(String args[]) {
Scanner scanner = new Scanner(System.in);
int required = scanner.nextInt();//required表示需要的铅笔数量
/**
* a存储两个整数
* 其中第1个整数表示这种包装内铅笔的数量
* 第2个整数表示这种包装的价格
* 一共3行,2列
*/
int a[][] = new int[3][2];
int sum[] = new int[3];//sum表示P老师需要购买多少件当前包装类型的铅笔
int c[] = new int[3];//c表示P老师购买之后的总价格
for (int i = 0; i < 3; i++) {
a[i][0] = scanner.nextInt();
a[i][1] = scanner.nextInt();// 输入对应的价格
if (required % a[i][0] != 0) {
sum[i] = (required / a[i][0]) + 1;
} else {
sum[i] = required / a[i][0];
}
c[i] = sum[i] * a[i][1];
}
Arrays.sort(c);//将3行数据排序按照从小到大
System.out.println(c[0]);//取最小的
scanner.close();
}
}
Day2 P1089 [NOIP2004 提高组] 津津的储蓄计划
题目描述
津津的零花钱一直都是自己管理。每个月的月初妈妈给津津 300300 元钱,津津会预算这个月的花销,并且总能做到实际花销和预算的相同。
为了让津津学习如何储蓄,妈妈提出,津津可以随时把整百的钱存在她那里,到了年末她会加上 20%20% 还给津津。因此津津制定了一个储蓄计划:每个月的月初,在得到妈妈给的零花钱后,如果她预计到这个月的月末手中还会有多于 100100 元或恰好 100100 元,她就会把整百的钱存在妈妈那里,剩余的钱留在自己手中。
例如 1111月初津津手中还有 8383 元,妈妈给了津津 300300 元。津津预计1111月的花销是 180180 元,那么她就会在妈妈那里存 200200 元,自己留下 183183 元。到了 1111 月月末,津津手中会剩下 33 元钱。
津津发现这个储蓄计划的主要风险是,存在妈妈那里的钱在年末之前不能取出。有可能在某个月的月初,津津手中的钱加上这个月妈妈给的钱,不够这个月的原定预算。如果出现这种情况,津津将不得不在这个月省吃俭用,压缩预算。
现在请你根据 20042004 年 11 月到 1212 月每个月津津的预算,判断会不会出现这种情况。如果不会,计算到 20042004 年年末,妈妈将津津平常存的钱加上 20%20% 还给津津之后,津津手中会有多少钱。
输入格式
1212 行数据,每行包含一个小于 350350 的非负整数,分别表示 11 月到 1212 月津津的预算。
输出格式
一个整数。如果储蓄计划实施过程中出现某个月钱不够用的情况,输出 -X*,- X* 表示出现这种情况的第一个月;否则输出到 20042004 年年末津津手中会有多少钱。
注意,洛谷不需要进行文件输入输出,而是标准输入输出。
注意for循环i从1开始(12个月)
import java.util.Scanner;
public class Main{
public static void main(String[] args){
Scanner scanner = new Scanner(System.in);
int flag = 1;//标记
int cost = 0;//花费
int value = 0;//存在妈妈那的钱
int money = 0;//自己的总钱
int deadm = 0;//透支月份
for(int i = 1; i < 13; i++){
money += 300;
cost = scanner.nextInt();
money -= cost;
if(money < 0){
flag = 0;
deadm = i;
break;
}
value += money/100;//存在妈妈手里100的个数
money %= 100;//剩余的钱
}
if(flag == 1){
money += value * 100 * 1.2;
System.out.println(money);
}else{
System.out.println(-deadm);
}
scanner.close();
}
}
Day3 P1085 [NOIP2004 普及组] 不高兴的津津
很简单的一道 注意代码风格 不然编译不予通过 (怪)
import java.util.Scanner;
public class Main {
public static void main(String args[]) {
Scanner scanner = new Scanner(System.in);
/*
a,b分别代表分别表示津津在学校上课的时间和妈妈安排她上课的时间
sum表示一天之内学习的时间总数
*/
int a,b,sum = 0,max = 0,day = 0;
for (int i = 1; i < 8; i++) {
a = scanner.nextInt();
b = scanner.nextInt();
sum = a+b;
if(sum>max && sum>8) {//在超过8小时且比之前几天都大的sum,将sum赋给最大值,并记录下津津的这天是哪一天
max = sum;
day = i;
}
}
System.out.println(day);//由于day初始化值为0所以如果津津没有不高兴的一天就直接输出0
scanner.close();
}
}
Day 4P1035 [NOIP2002 普及组] 级数求和
题目描述
输入格式
一个正整数 k*。
输出格式
一个正整数 n。
输入输出样例
输入 #1复制
1
输出 #1复制
2
很简单的求和
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner in = new Scanner(System.in);
int k = in.nextInt();
double sn = 0;
double n = 1;
boolean flag = true;
while (flag) {
sn = sn + 1 / n;
if (sn > k) {
System.out.println((int) n);
flag = false;
}
n++;
}
}
}
Day4 P1980 [NOIP2013 普及组] 计数问题
字符串分割
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int a = sc.nextInt();
int b = sc.nextInt();
int count=0;
for (int i = 1; i <= a; i++) {
String[] str = (i + "").split("");//注意
for (int j = 0; j < str.length; j++) {
if (str[j].equals(String.valueOf(b))){//注意字符串不能和数字比
count++;
}
}
}
System.out.println(count);
}
}
bug:编译失败
import java.util.Scanner;
/**
* @Author SouthWind
* @Date 2021/6/25 17:59
*/
public class count {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt(); //右区间
int x = sc.nextInt();
int a,b,sum = 0;
for(int i = 1; i<n+1; i ++){
a = i; //给循环的i 一个中转站
while(a != 0){ //当每一位都验证过后 a 变成0,自然就跳出循环
b = a % 10; //只取a个位上的数字
a = a / 10; //当他是多位数,让他去掉个位,即让十位变个位
if(b == x){ //看看此时a位置上的数字是否符合要求
sum++; //符合则统计加1
}
}
}
System.out.println(sum);
}
}
Day 5 P1014 [NOIP1999 普及组] Cantor 表
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int in = sc.nextInt();
int i = 1;
while (in > i) {
in = in - i;
i++;
}
// System.out.println(i); //第几行
// System.out.println(in); //第几个
int fz = 0, fm = 0; //定义分子和分母
if (i % 2 == 1) { //奇数行,自左下到右上
fz = i + 1 - in;
fm = in;
}else{ //偶数行,自右上到左下
fz=in;
fm=i+1-in;
}
System.out.println(fz + "/" + fm);
}
}
Day6 P1307 数字反转
熟悉java基本语法 对自负床相关属于发熟悉掌握
import java.util.Scanner;
public class Main{
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int a = scanner.nextInt();//输入一个数字
int count = 0;//计数器
while(a%10==0) {//将输入的数字后面的0都去掉,如380去掉之后变成38/38000去掉之后编程38等。
a = a/10;
}
//如果是负数将其变成整数,再设置计数器已备后面使用
if(a<0) {
a = -a;
count++;
}
//将数字装换成字符串
String str = String.valueOf(a);
//倒着输出
for (int i = str.length()-1; i >= 0; i--) {
//判断如果是负数则多输出一个'-'
if(count==1 && i==str.length()-1) {
System.out.print("-"+str.charAt(i));
}else{
System.out.print(str.charAt(i));
}
}
scanner.close();
}
}
Day 7 P1046 [NOIP2005 普及组] 陶陶摘苹果
import java.util.Scanner;
public class Main{
public static void main(String[] args){
int[] k = new int[10];
Scanner sc = new Scanner(System.in);
for(int i = 0;i < 10; i++){
int Ah = sc.nextInt();
k[i] = Ah;
}
int Ph = sc.nextInt() + 30;
//int Touch = Ph + 30;
int count = 0;
for(int i = 0;i < 10;i++){
if(K[i] <= Ph){
count++;
}
}
System.out.println(count);
}
}
Day 8 P1047 [NOIP2005 普及组] 校门外的树
桶排序
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner (System.in);
//L代表马路的长度,M代表区域的数目
int l = sc.nextInt();
int m = sc.nextInt();
//建立一个数组当做这一条路,初始化默认为0
int t[] = new int [10005];
//sum统计
int sum = 0;
for(int i=0; i<m; i++) {
//表示一个区域的起始点和终止点的坐标。
int n1 = sc.nextInt();
int n2 = sc.nextInt();
//循环遍历
for(int j=n1; j<=n2; j++) {
if(t[j]==0) { //如果这个位置有树
t[j]=1; //赋值为1
}
}
}
//再次循环遍历,统计数组为0的个数
for(int i=0; i<=l; i++) {
if(t[i]==0) {
sum++;
}
}
System.out.println(sum);
}
}
Day 8P1427 小鱼的数字游戏
陷阱
末尾0的位置 可能中甲出现0位置 所以不可理想化中间数字不出现0
错误代码
import java.util.Scanner;
public class Main{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
int[] k = new int[10001];
for(int i = 0;i < k.length; i++){
k[i] = sc.nextInt();
}
for(int j = k.length-1; j >= 0; j--){
if(k[j]!=0){
System.out.print(k[j]+" ");
}
}
}
}
import java.util.Scanner;
public class Main{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
int[] k = new int[10001];
int flag = 0;
for(int i = 0;i < k.length; i++){
k[i] = sc.nextInt();
if(k[i] == 0){
flag = i;
i = k.length;
}
}
for(int j = flag - 1; j >= 0; j--){
System.out.print(k[j]+" ");
}
}
}
Day8 P2141 [NOIP2014 普及组] 珠心算测验
三层for循环遍历相加 遍历数组中的元素 两两相加之和是否为数组中某一个数字
import java.util.Scanner;
public class Main{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int[] arr = new int[n];
for(int i = 0;i < arr.length;i++){
arr[i] = sc.nextInt();
}
int flag = 0;
for(int k = arr.length-1;k >= 0;k--){
for(int i = arr.length-1;i >= 0;i--){
for(int j = arr.length-1;j>= 0;j--){
if(arr[k] == arr[i] + arr[j] && i!=j){
flag++;
i = -1;
j = -1;
}
}
}
}
System.out.println(flag);
}
}
Day 8 P5594 【XR-4】模拟赛
题目提示二维数组
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner=new Scanner(System.in);
int n= scanner.nextInt();
int m= scanner.nextInt();
int k= scanner.nextInt();
int a[][]=new int[1001][1001];
for(int i=1;i<=n;i++){
for(int l=1;l<=m;l++){
int day= scanner.nextInt();
a[day][l]=1;
}
}
for(int i=1;i<=k;i++){
int sum=0;
for(int l=1;l<=m;l++){
if(a[i][l]==1){
sum++;
}
}
System.out.print(sum+" ");
}
}
}
Day 8P1055 [NOIP2008 普及组] ISBN 号码
注意情况分析
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
char[] ch=null;
char [] ch1=new char[13];
int sum=0;
int k=0;
Scanner sc = new Scanner(System.in);
String s1=sc.nextLine();
ch=s1.toCharArray();
for (int i=0;i<ch.length;i++){
if ((ch[i]>='a'&& ch[i]<='z')||(ch[i]>='A'&& ch[i]<='Z')||ch[i]>='0' && ch[i]<='9'){
ch1[k++]=ch[i];
}
}
for (int i=0;i<k-1;i++){
sum=sum+Character.getNumericValue(ch1[i])*(i+1);
}
char c='X';
int target=Character.getNumericValue(ch[ch.length-1]);
if (sum%11==target||(sum%11==10 && ch[ch.length-1]==c)){
System.out.print("Right");
}else if ((sum%11)==10){
ch[ch.length-1]=c;
System.out.print(ch);
}
else {
int a=sum%11;
char b= (char) (a+48);
ch[ch.length-1]=b;
System.out.print(ch);
}
}
}
Day 8 P1308 [NOIP2011 普及组] 统计单词数
Scanner.next()与Scanner.nextLine()的区别
1、next()方法在遇到有效字符前所遇到的空格、tab键、enter键都不能当作结束符,next()方法会自动将其去掉,只有当next()方法遇到有效字符之后,next()方法才将其后输入的空格键、Tab键或Enter键等视为分隔符或结束符,所以next()不能得到带有空格的字符串,只能得到部分字符串(空格前面的)。
2、nextLine()方法的结束符是Enter键,即nextLine()方法返回的是Enter键之前的所有字符串,所以nextLine()方法可以获取到带有空格的字符串。
equalsIgnoreCase()和equals()的区别
String a=“ABC”;
a.equals(“abc”)为false,
a.equalsIgnoreCase(“abc”)为true;
equalsIgnoreCase与equals区别是前者不区分大小写,而后者区分
equals() 会判断大小写区别,equalsIgnoreCase() 不会判断大小写区别
import java.util.Scanner;
public class Main{
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String word = scanner.nextLine();//这里同下
String text = scanner.nextLine();//重点,如果写成scanner.next()就会错误,因为只有nextLine()可以输入像空格、回车一样的字符
String[] datas = text.split(" ");//用分割函数将分割之后的串存到datas数组中
int count = 0;// 计数器
boolean flag = false;
int location = 0;// 表示在文章中第一次出现时,单词首字母在文章中的位置
for (int i = 0; i < datas.length; i++) {
if (datas[i].equalsIgnoreCase(word)) {
count++;
} else {
if (!flag) { // 如果已经出现了第一个单词,就不要再继续了
location += datas[i].length() + 1; // 如果遍历的单词不是,就把位置加好 遍历当前数组数
}
}
//判断,计算位置,想测试的话可以把下面的注释打开
if (count == 1) {
flag = true;
}
}
if (count == 0) {
//如果单词在文章中没有出现,则直接输出一个整数-1
System.out.println(-1);
} else {
System.out.println(count + " " + location);
}
scanner.close();
}
}
Day 8 回文日期
注意学会单独判断特殊情况 是否可以简化为一般情况 倒推
import java.util.Scanner;
public class P2010NOIP2016普及组回文日期 {
static int d[]= {0,31,29,31,30,31,30,31,31,30,31,30,31},ans;
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner in=new Scanner(System.in);
int d1=in.nextInt();
int d2=in.nextInt();
for (int i=1;i<=12;i++) {
for (int j=1;j<=d[i];j++) {
int r=(j%10)*1000+(j/10)*100+(i%10)*10+i/10;//前四位数
int sum=r*10000+i*100+j; //算出回文数
if (sum<d1||sum>d2) continue;
ans++;
}
}
System.out.println(ans);
}
}
scanner.close();
}
}
Day 8 回文日期
注意学会单独判断特殊情况 是否可以简化为一般情况 倒推
```java
import java.util.Scanner;
public class P2010NOIP2016普及组回文日期 {
static int d[]= {0,31,29,31,30,31,30,31,31,30,31,30,31},ans;
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner in=new Scanner(System.in);
int d1=in.nextInt();
int d2=in.nextInt();
for (int i=1;i<=12;i++) {
for (int j=1;j<=d[i];j++) {
int r=(j%10)*1000+(j/10)*100+(i%10)*10+i/10;//前四位数
int sum=r*10000+i*100+j; //算出回文数
if (sum<d1||sum>d2) continue;
ans++;
}
}
System.out.println(ans);
}
}