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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

[蓝桥杯][2018年第九届真题]倍数问题(贪心+思维)

發布時間:2023/12/15 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [蓝桥杯][2018年第九届真题]倍数问题(贪心+思维) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題目描述
眾所周知,小蔥同學擅長計算,尤其擅長計算一個數是否是另外一個數的倍數。但小蔥只擅長兩個數的情況,當有很多個數之后就會比較苦惱。現在小蔥給了你 n 個數,希望你從這 n 個數中找到三個數,使得這三個數的和是 K 的倍數,且這個和最大。數據保證一定有解。

輸入
從標準輸入讀入數據。

第一行包括 2 個正整數 n,?K。
第二行 n 個正整數,代表給定的 n 個數。
輸出
輸出到標準輸出。
輸出一行一個整數代表所求的和。
樣例輸入
4 3
1 2 3 4
樣例輸出
9
提示
對于 30% 的數據,n <= 100。
對于 60% 的數據,n?<= 1000。
對于另外 20% 的數據,K?<= 10。
對于 100% 的數據,1 <= n?<= 10^5, 1 <= K?<= 10^3,給定的 n 個數均不超過 10^8。
思路:因為k只有1e3的數據量,因此我們可以從k入手。我們先按照每個數對k取余的數字將每個數字分類。然后兩重循環枚舉0~k-1,這樣就可以求第三個數字。然后不對的更新最大值就可以了。
代碼如下:

#include<bits/stdc++.h> #define ll long long using namespace std;const int maxx=1e5+100; const int maxm=1e3+100; int a[maxx]; vector<int> p[maxm]; int n,k;bool cmp(int a,int b){return a>b;} int main() {scanf("%d%d",&n,&k);for(int i=1;i<=n;i++){scanf("%d",&a[i]);p[a[i]%k].push_back(a[i]);}for(int i=0;i<k;i++) sort(p[i].begin(),p[i].end(),cmp);int _max=0;for(int i=0;i<k;i++){if(p[i].size()==0) continue;if((3*i==k||i==0)&&p[i].size()>=3) _max=max(_max,p[i][0]+p[i][1]+p[i][2]);for(int j=0;j<k;j++){if(!p[j].size()) continue;int z=k-(i+j)%k;//!!這里要注意。if(z<0) continue;if(z==i&&z==j) continue;else if((i!=j)&&(z==i||z==j)&&p[z].size()>=2) _max=max(_max,p[i][0]+p[j][0]+p[z][1]);else if(i==j&&p[i].size()>=2&&p[z].size()>=1) _max=max(_max,p[i][0]+p[j][1]+p[z][0]);else if(i!=j&&i!=z&&j!=z&&p[i].size()>=1&&p[j].size()>=1&&p[z].size()>=1) _max=max(_max,p[i][0]+p[j][0]+p[z][0]); }}printf("%d\n",_max);return 0; }

努力加油a啊,(o)/~

總結

以上是生活随笔為你收集整理的[蓝桥杯][2018年第九届真题]倍数问题(贪心+思维)的全部內容,希望文章能夠幫你解決所遇到的問題。

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