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 中山大学程序设计大赛
- 思路:
- 一道模拟+暴力+思维的题
- 我觉得难的还是英文题意的理解,题意就是给你三视图,求体积。对于立方体图,若某一个位置存在小正方体,则在三视图的相应位置应该都存在。
- 要注意的就是输入的正视图和侧视图不是真实图的正视图和侧视图,而是分别向右翻转和上下翻转后的主视图和侧视图。但这个应该是出题者故意设计的,方便了代码的书写。
代码如下:
#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。
- 考点:线段树 or 树状数组 or 差分
- 这里用的是差分的做法。
不懂差分的看这里:【总结】差分原理详解(通俗易懂)
代码如下:
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浙江省赛
- 思路:
- 斐波那契数列前n项之和等于F[n+2]-1
- 题意即为前b项的和-前a-1项的和,即(F[b+2]-1)-(F[a+2-1]-1),也就是判断F[b+2]-F[a+1]的奇偶性
- 规律:
斐波那契数列:1 1 2 3 5 8 13
原数组奇偶性:奇奇偶 奇奇偶 奇奇偶 奇奇偶
前缀和奇偶性:奇偶偶 奇偶偶 奇偶偶 奇偶偶 - 用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);
}
}
}