第三届西南石油大学程序设计竞赛热身赛题解

这篇博客介绍了第三届西南石油大学程序设计竞赛的热身赛题解,包括A+B问题、跳远成绩计算、数字解密和位数问题四个题目。博主通过C/C++、Java、Python和Golang四种语言提供了代码实现,详细解析了每个问题的解决思路,涉及基础算法和数学应用。
摘要由CSDN通过智能技术生成

第三届西南石油大学程序设计竞赛热身赛题解

热身赛很简单就是拿来熟悉一下OJ比赛环境的

1.熟悉一下Online Judge的环境

就A+B经典入门问题没啥说的

#include<stdio.h>
int main(){
    int a,b;
    scanf("%d %d",&a,&b);
	printf("%d",a+b);
    return 0;
}

2.跳远成绩

就小学数学题也没啥说的

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main(){
    double x;
    scanf("%lf",&x);
    printf("%.1lf",(x+0.8*x+0.9*x)/3);

    return 0;
}

3.数字解密

就将这个四位数千位和百位颠倒、十位和个位颠倒就行

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main(){
    string s;
    cin>>s;
    cout<<s[1]<<s[0]<<s[3]<<s[2];
    return 0;
}

4.位数问题

一个不太难的dp,设dp[i] [0]表示i位数有偶数个3的数字个数,dp[i] [1]表示i位数有奇数个3的数字个数

那么构造递推式有

  • dp[i] [0] = dp[i-1] [0]*9 + dp[i-1] [1]
  • dp[i] [1] = dp[i-1] [1]*9 + dp[i-1] [0]

第一个递推式,前一半意思就是i-1位数所有有偶数个3的数字个数,然后第i位放0~9除了3一共9个数,这样就组成了i位数字有偶数个3,后一半意思是i-1位数所有有奇数个3的数字个数,然后第i位放3,这样也组成了i位数字有偶数个3加起来就是总个数

第二个递推式和上面差不多,前一半意思就是i-1位数所有有奇数个3的数字个数,然后第i位放0~9除了3一共9个数,这样就组成了i位数字有奇数个3,后一半意思是i-1位数所有有偶数个3的数字个数,然后第i位放3,这样也组成了i位数字有奇数个3加起来就是总个数

然后还有一个问题就是最高位不能是0,所以在计算最高位的时侯不能放0,且只有一位数的时候,也只能也只能是1~9,9个数字,因为0不能做为位数讨论
C/C++:

#include<iostream>
using namespace std;
const int md =12345;
int dp[1005][5];
int main(){
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    int n;
    cin>>n;
    dp[1][0]=9;//初始化
    dp[1][1]=1;
    for(int i=2;i<n;i++){
        dp[i][0]=(dp[i-1][0]*9+dp[i-1][1])%md;
        dp[i][1]=(dp[i-1][1]*9+dp[i-1][0])%md;
    }
    dp[n][0]=(dp[n-1][0]*8+dp[n-1][1])%md;//最高位单独计算
    if(n==1)dp[n][0]=8;//只有一位数的时候特判
    cout<<dp[n][0];

    return 0;
}

Java:

import java.util.Scanner;
public class Main{
    public static void main(String args[]){
        Scanner cin=new Scanner(System.in);
        int [][]dp= new int [1005][5];
        int n,md=12345;
        n =cin.nextInt();
        dp[1][0]=9;
        dp[1][1]=1;
        for(int i=2;i<n;i++) {
        	dp[i][0]=(dp[i-1][0]*9+dp[i-1][1])%md;
        	dp[i][1]=(dp[i-1][1]*9+dp[i-1][0])%md;
        }
        dp[n][0]=(dp[n-1][0]*8+dp[n-1][1])%md;
        if(n==1)dp[n][0]=8;
        System.out.println(dp[n][0]);
    }

}

Python:

dp = [[0 for j in range(1, 5)] for i in range(1, 1005)]
md = 12345
n = int(input())
dp[1][0]=9
dp[1][1]=1
for i in range(2,n):
    dp[i][0]=(dp[i-1][0]*9+dp[i-1][1])%md
    dp[i][1]=(dp[i-1][1]*9+dp[i-1][0])%md
dp[n][0]=(dp[n-1][0]*8+dp[n-1][1])%md
if(n==1) :
    dp[n][0]=8
print(dp[n][0])

Golang

package main

import "fmt"

func main() {
	var dp [1005][5]int
    n:=0
	md := 12345
    _, err := fmt.Scanf("%d", &n)
    if err != nil{
        
    }
	dp[1][0] = 9
	dp[1][1] = 1
    for i := 2; i < n; i++ {
		dp[i][0] = (dp[i-1][0]*9 + dp[i-1][1]) % md
		dp[i][1] = (dp[i-1][1]*9 + dp[i-1][0]) % md
	}
	dp[n][0] = (dp[n-1][0]*8 + dp[n-1][1]) % md
	if n == 1 {
		dp[n][0] = 8
	}
	fmt.Println(dp[n][0])

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值