2019爪哇部落新生选拔赛





A - 空军十一号(模拟 签到)

原题链接:http://oj.javatribe.org/problem/2019选拔赛A题

  • 思路: 模拟题,题目很长,但只有一句话是有用的信息,直接 if…else…疯狂输出即可。

C++ Code:

#include <iostream>
using namespace std;
int main() {
	ios::sync_with_stdio(0);
	int n1,p1,s1;
	cin>>n1>>p1>>s1;
	int n2,p2,s2;
	cin>>n2>>p2>>s2;
	if(n1>n2)
		cout<<1<<endl;
	else if(n2>n1)
		cout<<2<<endl;
	else if(n1==n2){
		if(p1<p2)
			cout<<1<<endl;
		else if(p2<p1)
			cout<<2<<endl;
		else if(p1==p2){
			if(s1<s2)
				cout<<1<<endl;
			else if(s2<s1)
				cout<<2<<endl;
			else if(s2==s1)
				cout<<"God"<<endl;
		}
	}
	return 0;
}

Java Code:

import java.util.Scanner;
public class Main {
	public static void main(String[] args) {
		Scanner cin = new  Scanner(System.in);
		int n1 = cin.nextInt();
		int p1 = cin.nextInt();
		int s1 = cin.nextInt();
		int n2 = cin.nextInt();
		int p2 = cin.nextInt();
		int s2 = cin.nextInt();
		if(n1>n2)	System.out.println(1);
		else if(n1<n2)	System.out.println(2);
		else {
			if(p1<p2)	System.out.println(1);
			else if(p1>p2)	System.out.println(2);
			else {
				if(s1<s2)	System.out.println(1);
				else if(s1>s2)	System.out.println(2);
				else	System.out.println("God");
			}
		}
	}
}


C - 爪爪逃逸(模拟 签到)

原题链接: 2017 CCPC区域赛秦皇岛

  • 思路: 模拟题,以m位置为起点,向右遍历到n-1,计算“L”的个数sum1;以位置为起点,向左遍历到2,计算“R”的个数sum2;最后比较sum1和sum2,输出较小的那个。

C++ Code:

#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std; 
char a[1000000];
int main(){
	ios::sync_with_stdio(0);
	int t;
	cin>>t;
	while(t--){
		int n,m;
		cin>>n>>m;
		for(int i=1;i<=n;i++)
			cin>>a[i];
		int sum1=0,sum2=0;
		for(int i=2;i<=m;i++){
			if(a[i]=='R')
				sum1++;
		}
		for(int i=m;i<n;i++){
			if(a[i]=='L')
				sum2++;
		}
		int ans=min(sum1,sum2);
		cout<<ans<<endl;
	}
	return 0;
}


D - 小爪的三视图(模拟)

原题链接:2019 中山大学程序设计大赛

  • 思路:
  1. 一道模拟+暴力+思维的题
  2. 我觉得难的还是英文题意的理解,题意就是给你三视图,求体积。对于立方体图,若某一个位置存在小正方体,则在三视图的相应位置应该都存在。
  3. 要注意的就是输入的正视图和侧视图不是真实图的正视图和侧视图,而是分别向右翻转和上下翻转后的主视图和侧视图。但这个应该是出题者故意设计的,方便了代码的书写。

代码如下:

#include <iostream>
#include <algorithm>
#include <cstdio>
using namespace std; 
int a[105][105],b[105][105],c[105][105];
int main(){
	ios::sync_with_stdio(0);
	int x,y,z;
	while(cin>>x>>y>>z){
		for(int i=1;i<=x;i++)	//输入主视图 
			for(int j=1;j<=y;j++)
				cin>>a[i][j];
		for(int i=1;i<=y;i++)	//输入侧视图 
			for(int j=1;j<=z;j++)
				cin>>b[i][j];
		for(int i=1;i<=z;i++)	//输入俯视图 
			for(int j=1;j<=x;j++)
				cin>>c[i][j];
		int ans=0;	 
		for(int i=1;i<=x;i++){
			for(int j=1;j<=y;j++){
				for(int k=1;k<=z;k++){
					//如果三个视图该位置都为1 
					if(a[i][j]==1&&b[j][k]==1&&c[k][i]==1)	
						ans++;	//证明该位置存在小正方体 
				}
			}
		}
		cout<<ans<<endl;
	} 
	return 0;
}


H - 部落外的树(线段树 / 树状数组 / 差分)

原题链接:部落oj校门外的树(数据加强)

  • 思路: 本来是一道模拟题,但数据加强了,模拟会TLE。
  1. 考点:线段树 or 树状数组 or 差分
  2. 这里用的是差分的做法。

不懂差分的看这里:【总结】差分原理详解(通俗易懂)

代码如下:

import java.util.Arrays;
import java.util.Scanner;
class node implements Comparable<node>{
	int l,r;
	public node(int l,int r) {
		this.l=l;
		this.r=r;
	}
	public node(){};
	public int compareTo(node a) {
		if(this.l==a.l)	return this.r-a.r;
		return this.l-a.l;
	}
}
public class Main {
	static int[] a = new int[1000100];
	static void add(int l,int y,int val) {
		a[l]+=val;
		a[y]-=val;
	}
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner cin = new Scanner(System.in);
		int t = cin.nextInt();
		while(t-- >0) {
			Arrays.fill(a, 0);
			int n = cin.nextInt(), m = cin.nextInt();
			n++;
			for(int i=1;i<=m;i++) {
				int x = cin.nextInt(),	y = cin.nextInt();
				x++;y++;
				add(x,y+1,1);
			}
			int ans=0;
			for(int i=1;i<=n;i++) {
				a[i]+=a[i-1];
				if(a[i]>0)
					ans++;
			}
			System.out.println(n-ans);
		}
	}
}


I - 爪爪口袋中的斐波那契(大数类+规律)

原题链接:2019 CCPC浙江省赛

  • 思路:
  1. 斐波那契数列前n项之和等于F[n+2]-1
  2. 题意即为前b项的和-前a-1项的和,即(F[b+2]-1)-(F[a+2-1]-1),也就是判断F[b+2]-F[a+1]的奇偶性
  3. 规律:
    斐波那契数列:1 1 2 3 5 8 13
    原数组奇偶性:奇奇偶 奇奇偶 奇奇偶 奇奇偶
    前缀和奇偶性:奇偶偶 奇偶偶 奇偶偶 奇偶偶
  4. 用java的大数类,b+2和a+1分别对3取模,分别确定奇偶性,然后通过奇-奇=偶,偶-偶=偶,其他都为奇来判断

代码如下:

import java.math.BigInteger;
import java.util.Scanner;
public class Main{
  public static void main(String[] args){
    Scanner read = new Scanner(System.in);
    int t=read.nextInt();
    while(t-- >0){
      BigInteger a = read.nextBigInteger().add(BigInteger.valueOf(1));
      BigInteger b = read.nextBigInteger().add(BigInteger.valueOf(2));
      int flag_a=1,flag_b=1;
      if(a.mod(BigInteger.valueOf(3)).equals(BigInteger.valueOf(0)))
        flag_a=0;
      if(b.mod(BigInteger.valueOf(3)).equals(BigInteger.valueOf(0)))
        flag_b=0;
      if((flag_a==1&&flag_b==0)||(flag_a==0&&flag_b==1))
        System.out.println(1);
      else
        System.out.println(0);
    }
  }
}


  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值