2020.10.04蓝桥测试
文章目錄
- 加速輸入代碼
- A跑步訓練
- B: 合并檢測
- C: 分配口罩
- D: 矩陣
- 卡特蘭數c++
- 卡特蘭數java
- E完美平方數
- F解碼
- G: 走方格
- H: 整數小拼接
- I: 超級膠水
- J: 網絡分析
加速輸入代碼
std::ios::sync_with_stdio(0);cin.tie(0);A跑步訓練
這里可以口算:答案為:3880.
也可以寫程序模擬:
energy = 10000 min = 0 second = 0 while(energy):min += 1if min % 2 == 1:if energy > 600 :energy -= 600else: //這里就是/min -= 1second = energy/10energy = 0else:energy += 300if energy <= 0:break print(min*60+second)B: 合并檢測
#include <stdio.h> int main() {double min=101;//最少組數 double zu,k,kmin;//zu當前組數,k組數,kmin最小組數 //假設99人1人感染//printf("%f\n",min);for(k=0;k<100;k++){zu=(100/k)+k;//printf("%f",zu);if(zu<min){min=zu;kmin=k;}}printf("min:%f\n",min);printf("kmin:%f",kmin);return 0; }
手寫:n/k+0.01nk—有n/k組,最壞0.01*n組有人,每組k次測試(每人都有一個組)
C: 分配口罩
package competition4;public class Distribution2 {public static int[] arr ={ 9090400, 8499400, 5926800, 8547000, 4958200, 4422600, 5751200, 4175600, 6309600, 5865200, 6604400, 4635000,10663400, 8087200, 4554000 };public static int min=Integer.MAX_VALUE;public static int sum=0;public static boolean[] visited=new boolean[arr.length];public static void main(String[] args){for(int x=0;x<arr.length;x++){sum +=arr[x];}dfs(0);System.out.println(min);}public static void dfs(int index){if(index>=sum/2){min = Math.min(min, Math.abs(sum-index*2));return;}for(int x=0;x<arr.length;x++){if(!visited[x]){visited[x]=true;dfs(index+arr[x]);visited[x]=false;}}} } 現在要把這所有的數據分配給兩家醫院,要使兩家醫院分配的口罩的差值最小,假設所有口罩為sum,那么一家醫院的口罩數目會小于sum/2,一家會大于sum/2,設小于的為lesssum,大于的為greatersum,就有差值 = greatersum - lesssum = ( sum/2 - lesssum ) * 2 = ( greatersum - sum/2 ) * 2 所有題目就可以變相理解成:一個背包的大小為sum/2,現在我要把上面的口罩放入背包,求放入背包的最大值,求出了最大值就可以求出和sum/2的差值了,乘以2就是題目要求的值了[nb](https://blog.csdn.net/weixin_43846904/article/details/108974218)代碼 public class Main {public static void main(String[] args) {int sum = 0 , su = 0;int[] nums = {0, 9090400, 8499400, 5926800, 8547000, 4958200,4422600, 5751200, 4175600, 6309600, 5865200, 6604400, 4635000,10663400, 8087200, 4554000};for (int i = 0; i < nums.length; i++) {sum = sum + nums[i];}su = sum / 2;int[] dp = new int[su+1];for (int i = 1; i < nums.length; i++) {for (int j = su; j >= nums[i]; j--) {dp[j] = Math.max(dp[j] , dp[j-nums[i]] + nums[i]);}}System.out.println(2 * (su - dp[su]));} }D: 矩陣
第十一屆藍橋杯 ——矩陣目前最喜歡的題解,DP,i是第一行數量,j是第二行數量
DP進行方案數計數,dp(i,j)表示前i個數選其中j個放入第一行,轉移策略如代碼中注釋所示。
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int maxn=2500; int dp[maxn][maxn];//dp[i][j]表示前i個數放其中j個到第一行的方案數; int main() {int i,j;memset(dp,0,sizeof(dp));dp[1][1]=1;//1肯定放到第一行(若放到第二行不可能比第一行大)//維護dp表的下三角即可(j>i的上三角無意義)//dp策略://1.數字放在第一行肯定可以,后面遍歷的數字越來越大;//2.數字放在第二行的條件是目前第一行的數字比第二行多,// 因為若目前少,則之后肯定得有更大的數放到第一行,與要求沖突 for(i=2;i<=2020;i++){for(j=1;j<=i;j++){dp[i][j]=(dp[i][j]+dp[i-1][j-1])%2020;//放到第一行; if(i-j<=j)//i-j為放第二行的數字數,即放第二行的數字數小于第一行的數字數的情況(此時i是正要遍歷的,所以等號可取) {//放到第二行; dp[i][j]=(dp[i][j]+dp[i-1][j])%2020;} }}printf("%d\n",dp[2020][1010]);return 0;} //1340【Java編程】Java中的大整數計算
java 大整數
卡特蘭數詳講
卡特蘭數 — 計數的映射方法的偉大勝利
python實現篩法求素數
Python取整——向上取整、向下取整、四舍五入取整、向0取整
兩個有趣且特殊的Python取整:int()、整除"//"
python一定記得整除//
沒有數組,只能列表
catalan=[1,1,2]
catalan.append(y)
卡特蘭數:
這個轉成python就能求,數組用list
a=[1,1,2]
加入用append
a.append(x)
卡特蘭數c++
#include <iostream> #include<bits/stdc++.h> /* run this program using the console pauser or add your own getch, system("pause") or input loop */ using namespace std; long long catalan[2025]={0}; int main(int argc, char *argv[]) {catalan[0]=catalan[1]=1;catalan[2]=2;for(int i=3;i<100;i++){for(int j=0;j<i;j++){catalan[i]+=catalan[j]*catalan[i-1-j];//這是一種求法} }for(int i=0;i<100;i++){cout<<catalan[i]<<endl;} // cout<<0<<endl;return 0; }卡特蘭數java
這里一定要建一個,不然后面直接調用會空指針異常
import java.io.*; import java.math.*; class test {public static void main (String[] args) throws java.lang.Exception{BigInteger []a=new BigInteger[2025];a[0]=BigInteger.valueOf(1);a[1]=BigInteger.valueOf(1);a[2]=BigInteger.valueOf(2);for(int i=3;i<2020;i++){a[i]= BigInteger.valueOf(0);//這里一定要建一個,不然后面直接調用會空指針異常for(int j=0;j<i;j++){a[i]=a[i].add(a[j].multiply(a[i-1-j]));}}for(int i=0;i<101;i++){System.out.println(a[i]);}} }E完美平方數
【問題】
如果整個整數X本身是完全平方數,同時它的每一位數字也都是完全平方數,我們就稱X是完美平方數。 前幾個完美平方數是 0、1、4、9、100、144…
請你計算第 2020 個完美平方數是多少?
暴力搜索代碼:
///到目前已經跑了2.5個點了
F解碼
#include <iostream> #include<bits/stdc++.h> /* run this program using the console pauser or add your own getch, system("pause") or input loop */ using namespace std; int isnumber(char a){if(a<='9'&&a>='0'){return 1;}return 0; } int main(int argc, char *argv[]) {char str[1000];cin>>str;char buf;int n=strlen(str);for(int i=0;i<n;i++){if(!isnumber(str[i])){buf=str[i];cout<<str[i];}else{for(int j=0;j<str[i]-'0'-1;j++){cout<<buf;}}}return 0; }G: 走方格
自己寫的遞歸代碼
#include <iostream> #include<bits/stdc++.h> using namespace std; #define maxn 10000 int dp[maxn][maxn]={0}; int zou(int m,int n){cout<<"m "<<m<<"n:"<<n<<endl;if(m==1&&n==1){dp[m][n]=1;return 1;}if(m%2==0&&n%2==0){dp[m][n]=0;return 0;}if(m==1){return 1;}if(n==1){return 1;}if(dp[m][n]!=0){return dp[m][n];}dp[m][n]=zou(m-1,n)+zou(m,n-1);return dp[m][n]; }int main(int argc, char *argv[]) {int m,n;cin>>m>>n;cout<<zou(m,n);cout<<endl;for(int i=1;i<=m;i++){for(int j=1;j<=n;j++){cout<<dp[i][j]<<" ";}cout<<endl;}return 0; }H: 整數小拼接
我的第一遍代碼
https://www.cnblogs.com/sddr/p/13258916.html
典型的排列問題,直接上八皇后的模板,事實上所有的排列問題,都能用它解決,只需要在排列好兩個數的時候,進行拼接,比較大小,計數即可,唯一害怕的就是時間過不了
I: 超級膠水
應該就是矩陣連乘
動態規劃:矩陣連乘問題(C++實現,含備忘錄方法)
斜著遍歷代碼
J: 網絡分析
https://blog.csdn.net/weixin_43738764/article/details/109035131
總結
以上是生活随笔為你收集整理的2020.10.04蓝桥测试的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: systemd 服务管理编写
- 下一篇: ACM取余