第三届西南石油大学程序设计竞赛热身赛题解
热身赛很简单就是拿来熟悉一下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])
}