日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

2020.10.04蓝桥测试

發布時間:2024/10/8 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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.

10000 / (600-300) == 33.33 33*(600-300) = 9900 10000 - 9900 + 300 = 400 < 600 所以時間為32*2*60 + 400/10 = 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個點了

tot = 7 i =13 ans=0 while(tot<2020):num=0num=i*iwhile(num!=0):now=0now=num%10if now!=0 and now!=1 and now!=4 and now!=9:breaknum//=10if num==0:tot+=1if tot==2020:ans=i*ii+=1if i%100000==0:print('i:%d tot:%d ans:%d'%(i,tot,ans)) print(ans)

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<bits/stdc++.h> #define x first #define y second #define mem(h) memset(h,-1,sizeof h) #define mcp(a,b) memcpy(a,b,sizeof b) using namespace std; typedef long long LL; typedef unsigned long long ull; typedef pair<int,int>PII; typedef pair<double,double>PDD; namespace IO{inline LL read(){LL o=0,f=1;char c=getchar();while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}while(c>='0'&&c<='9'){o=o*10+c-'0';c=getchar();}return o*f;} }using namespace IO; //#############以上是自定義技巧(可忽略)########## const int N=1e4+7,M=2e5+7,INF=0x3f3f3f3f,mod=1e8+7,P=131; int n,m; int dp[N][N]; int main(){cin>>n>>m;dp[1][1]=1;for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){if(i==1&&j==1)continue;if(i%2!=0||j%2!=0){//如果有一個不為偶數dp[i][j]+=dp[i-1][j];//可以從上面轉移過來dp[i][j]+=dp[i][j-1];//可以從左邊轉移過來}else{//否則就進不來,為0dp[i][j]=0;}}}cout<<dp[n][m]<<endl;return 0; }

自己寫的遞歸代碼

#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: 整數小拼接


我的第一遍代碼

#include <iostream>//應該還可以優化,這里用的式=是直接求出來,但應該會爆,用取K的每一位(比如40+i肯定大于K=33) //還可以剪枝 #include<bits/stdc++.h> using namespace std; #define maxn 10000 int val[maxn]={0}; int weishumem[maxn]={0}; int weishu(int i) {int n=val[i];if(weishumem[i]!=0){return weishumem[i];}int sum=0;while(n){n/=10;sum++;}weishumem[i]=sum;return sum; } int shicifang(int n){int ans=1;for(int j=0;j<n;j++){ans*=10;}return ans; } int main(int argc, char *argv[]) {int K,n;cin>>n>>K;for(int i=1;i<=n;i++){cin>>val[i];}///開拼 +int sum=0;for(int i=1;i<=n;i++){for(int j=i;j<=n;j++)///這里很重要 {if(i==j){continue;}int weishu_i=weishu(val[i]);int weishu_j=weishu(val[j]);int shicifang_i=shicifang(weishu_i)*val[j];int shicifang_j=shicifang(weishu_j)*val[i];///i在后 if(shicifang_i+val[i]<=K){sum++;}if(shicifang_j+val[j]<=K){sum++;}}}cout<<sum;return 0; }

https://www.cnblogs.com/sddr/p/13258916.html
典型的排列問題,直接上八皇后的模板,事實上所有的排列問題,都能用它解決,只需要在排列好兩個數的時候,進行拼接,比較大小,計數即可,唯一害怕的就是時間過不了

#include<iostream> using namespace std; int n,k,sum=0; int a[5]; int b[100005]; bool isok(int r){for(int i=0;i<r;i++){if(a[i]==a[r]){return false;}}return true; } void dfs(int r){if(r==2){int w=1;while(b[a[1]]/w){w *= 10;}int cache = b[a[0]]*w+b[a[1]];if(cache<k){sum++;}return ;}for(int i=0;i<4;i++){a[r]=i;if(isok(r)){dfs(r+1);}} } int main() {cin >> n >> k;for(int i=0;i<n;i++){cin >> b[i];}dfs(0);cout << sum;return 0; }

I: 超級膠水


應該就是矩陣連乘

動態規劃:矩陣連乘問題(C++實現,含備忘錄方法)
斜著遍歷代碼

#include <iostream> #include<bits/stdc++.h> using namespace std; #define maxn 10000 int dp[maxn][maxn]={0}; int val[maxn]={0}; int dp_hei[maxn][maxn]={0}; int weiji(int m,int n) {if(dp_hei[m][n]!=0)return dp_hei[m][n];int sum=0;for(int i=m;i<=n;i++){sum+=val[i];}dp_hei[m][n]=sum;return sum; } int dp_m(int m,int n) {if(dp[m][n]!=0){return dp[m][n];}if(m==n){return 0;}int min_k=maxn*10;for(int k=m;k<n;k++){min_k=min(min_k,dp_m(m,k)+dp_m(k+1,n)+weiji(m,k)*weiji(k+1,n));///這里從m開始,重量計算也dp}dp[m][n]=min_k;return dp[m][n]; }int main(int argc, char *argv[]) {int n;cin>>n;for(int i=1;i<=n;i++){cin>>val[i];}cout<<dp_m(1,n);return 0; }

J: 網絡分析


https://blog.csdn.net/weixin_43738764/article/details/109035131

總結

以上是生活随笔為你收集整理的2020.10.04蓝桥测试的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。