CSP 小中大问题

题目很唬人,说什么有小数仅保留一位小数,其实如果有小数最多也就只有一位。。。但是注意,如果运算结果没有小数必须以整数的形式输出,这时候可以利用flag判断一下是否是整数。

PS:CSP java等级真的低。。。

package test;

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner in=new Scanner(System.in);
        int n=in.nextInt();
        int []a=new int[n+1];
        for(int i=0;i<n;i++){
            a[i]=in.nextInt();
        }
        int min=0,max=0;
        int medium=0;
        double mid=0;
        boolean flag=false;
        if(a[n-1]>=a[0]){   //升序
            max=a[n-1];
            min=a[0];
        }
        else {
            min = a[n-1];
            max = a[0];
        }
        if(n%2==0){  //偶数个
            if((a[n/2]+a[n/2-1])%2!=0)
            {
                flag=true;
            }
            else
            {
                medium=(a[n/2]+a[n/2-1])/2;
            }
        }
        else {
            medium=a[n/2];
        }
        if(flag){
            mid=(a[n/2]+a[n/2-1])/2.0;
            System.out.println(max+" "+mid+" "+min);
        }
        else
        {
            System.out.println(max+" "+medium+" "+min);
        }
    }
}
2.期末预测阈值问题(重点在数的大小上)
package test;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        int n;
        Scanner in=new Scanner(System.in);
        n=in.nextInt();
        long sum=0;
        int w,score;
        for(int i=0;i<n;i++) {
            w = in.nextInt();
            score = in.nextInt();
            sum += w * score;
        }
        long y=Math.max(sum,0);
        System.out.println(y);
    }
}
3.稀疏向量

都是用的map,为啥java超内存了。。。但是C++可以。。。

#include<stdlib.h>
#include<iostream>
#include<algorithm>
#include<Windows.h>
#include<string>
#include<map>
#include<vector>
#include<set>
using namespace std;

int main(){
	map<int, int> mapA;
	map<int, int> mapB;
	int n, a, b;
	int first, second;
	cin >> n >> a >> b;
	for (int i = 0; i < a; i++) {
		cin >> first >> second;
		mapA[first] = second;
	}

	for (int i = 0; i < b; i++) {
		cin >> first >> second;
		mapB[first] = second;
	}
	map<int, int>::iterator it = mapA.begin();
	int index;
	int valueA, valueB;
	long long sum = 0;
	for (it; it != mapA.end(); it++) {
		index = it->first;
		if (mapB.find(index) != mapB.end()) {
			valueA = it->second;
			valueB = mapB.find(index)->second;
			sum += valueA * valueB;
		}
	}
	cout << sum;
}
4.种苹果
package test;

import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner in=new Scanner(System.in);
        int sumFruit=0;
        int dropTreeNum=0;
        int E=0;
        int N=in.nextInt();
        int[] Drop=new int[N+1]; //初始值均为0,用于记录是否发生落果。
        int m;
        int sum;
        int temp;
        for(int i=0;i<N;i++){
            sum=0;  //本棵树最终的果子个数
            m=in.nextInt();
            for(int j=0;j<m;j++){
                if(j==0){
                   sum=in.nextInt();
                }
                else{
                    temp=in.nextInt();
                    if(temp<=0){
                        sum+=temp;
                    }
                    else{
                        if(temp<sum){  //发生落果
                            Drop[i]=1;
                            sum=temp;
                        }
                        else
                            continue;;
                    }
                }
            }
            sumFruit+=sum;
            if(Drop[i]==1){
                dropTreeNum++;
            }
        }
        //开始计算落果。
        for(int i=0;i<N;i++){
            if(Drop[i]==1&&Drop[(i+1)%N]==1&&Drop[(i+2)%N]==1){
                E++;
            }
        }
        System.out.println(sumFruit+" "+dropTreeNum+" "+E);
    }
}
5.公共钥匙盒问题:

问题描述
  有一个学校的老师共用N个教室,按照规定,所有的钥匙都必须放在公共钥匙盒里,老师不能带钥匙回家。每次老师上课前,都从公共钥匙盒里找到自己上课的教室的钥匙去开门,上完课后,再将钥匙放回到钥匙盒中。
  钥匙盒一共有N个挂钩,从左到右排成一排,用来挂N个教室的钥匙。一串钥匙没有固定的悬挂位置,但钥匙上有标识,所以老师们不会弄混钥匙。
  每次取钥匙的时候,老师们都会找到自己所需要的钥匙将其取走,而不会移动其他钥匙。每次还钥匙的时候,还钥匙的老师会找到最左边的空的挂钩,将钥匙挂在这个挂钩上。如果有多位老师还钥匙,则他们按钥匙编号从小到大的顺序还。如果同一时刻既有老师还钥匙又有老师取钥匙,则老师们会先将钥匙全还回去再取出。
  今天开始的时候钥匙是按编号从小到大的顺序放在钥匙盒里的。有K位老师要上课,给出每位老师所需要的钥匙、开始上课的时间和上课的时长,假设下课时间就是还钥匙时间,请问最终钥匙盒里面钥匙的顺序是怎样的?
输入格式
  输入的第一行包含两个整数N, K。
  接下来K行,每行三个整数w, s, c,分别表示一位老师要使用的钥匙编号、开始上课的时间和上课的时长。可能有多位老师使用同一把钥匙,但是老师使用钥匙的时间不会重叠。
  保证输入数据满足输入格式,你不用检查数据合法性。
输出格式
  输出一行,包含N个整数,相邻整数间用一个空格分隔,依次表示每个挂钩上挂的钥匙编号。

  
样例输入
5 2
4 3 3
2 2 7
样例输出
1 4 3 2 5

关键在于还钥匙的时候是根据钥匙号从小到大还!!!

package test;
import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner in=new Scanner(System.in);
        int N=in.nextInt();  //N把钥匙
        int []numList=new int[N+1];
        for(int i=1;i<=N;i++){  //初始时每个位置的钥匙号。
            numList[i]=i;
        }
        int K=in.nextInt();  //K个老师操作
        int [][]borrowTime=new int[K][2];
        int [][]returnTime=new int[K][2];
        for(int i=0;i<K;i++){
            borrowTime[i][0]=in.nextInt();  //借的钥匙号码
            returnTime[i][0]=borrowTime[i][0];
            borrowTime[i][1]=in.nextInt();  //开始使用的时间
            returnTime[i][1]=borrowTime[i][1]+in.nextInt();  //归还的时间
        }
        //排序,按时间排序;
        quickSort(borrowTime,0,K-1);
        quickSort(returnTime,0,K-1);
        int borrowRecord=0,returnRecord=0;  //记录到谁了。
        for(int t=1;t<=10101;t++){
            int []record=new int[K];
            int k=0;
            for(int i=returnRecord;i<K;i++){  //注意,还钥匙有顺序
                if(returnTime[i][1]>t){
                    returnRecord=i;
                    break;
                }
                else if(returnTime[i][1]<t){
                    continue;
                }
                else if(returnTime[i][1]==t){
                    record[k++]=returnTime[i][0];
                }
            }
            if(k!=0){
                quickSortInt(record,0,k-1);
                for(int z=0;z<k;z++){
                    int location=findEmpty(numList);
                    numList[location]=record[z];
                }
            }

            for(int j=borrowRecord;j<K;j++){
                if(borrowTime[j][1]>t){
                    borrowRecord=j;
                    break;
                }
                else if(borrowTime[j][1]<t){
                    continue;
                }
                else if(borrowTime[j][1]==t){
                    int location=findLocation(numList,borrowTime[j][0]);
                    numList[location]=0; //钥匙拿走。
                }
            }
        }
        for(int i=1;i<=N;i++){  //最终每个位置的钥匙号。
            System.out.print(numList[i]+" ");
        }
    }

    public static int findLocation(int[] numList,int borrowNum){
        int i;
        for(i=1;i<=numList.length;i++){
            if(numList[i]==borrowNum){
                break;
            }
        }
        return i;
    }

    public static int findEmpty(int[] numList){  //找最小空闲位置
        int i;
        for(i=1;i<=numList.length;i++){
            if(numList[i]==0){
                break;
            }
        }
        return i;
    }

    public static int pivocky(int[][] Time,int low,int high){  //按照第二维度排序
        int []temp=new int[2];
        temp=Time[low];
        int pivock=Time[low][1];
        while(low<high){
            while(low<high&&Time[high][1]>=pivock) high--;
            Time[low]=Time[high];
            while (low<high&&Time[low][1]<=pivock) low++;
            Time[high]=Time[low];
        }
        Time[high]=temp;
        return high;
    }

    public static void quickSort(int[][] Time,int low,int high){
        if(low<high){
            int pivock=pivocky(Time,low,high);
            quickSort(Time,low,pivock-1);
            quickSort(Time,pivock+1,high);
        }
    }

    public static int pivockyint(int[] Time,int low,int high){  //按照第二维度排序
        int temp;
        temp=Time[low];
        int pivock=Time[low];
        while(low<high){
            while(low<high&&Time[high]>=pivock) high--;
            Time[low]=Time[high];
            while (low<high&&Time[low]<=pivock) low++;
            Time[high]=Time[low];
        }
        Time[high]=temp;
        return high;
    }

    public static void quickSortInt(int[]Time,int low,int high){
        if(low<high){
            int pivock=pivockyint(Time,low,high);
            quickSortInt(Time,low,pivock-1);
            quickSortInt(Time,pivock+1,high);
        }
    }
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值