2017年第八届蓝桥杯【C++省赛B组】
1.標題: 購物單
??? 小明剛剛找到工作,老板人很好,只是老板夫人很愛購物。老板忙的時候經常讓小明幫忙到商場代為購物。小明很厭煩,但又不好推辭。
??? 這不,XX大促銷又來了!老板夫人開出了長長的購物單,都是有打折優惠的。
??? 小明也有個怪癖,不到萬不得已,從不刷卡,直接現金搞定。
??? 現在小明很心煩,請你幫他計算一下,需要從取款機上取多少現金,才能搞定這次購物。
??? 取款機只能提供100元面額的紙幣。小明想盡可能少取些現金,夠用就行了。
??? 你的任務是計算出,小明最少需要取多少現金。
以下是讓人頭疼的購物單,為了保護隱私,物品名稱被隱藏了。
-----------------
****???? 180.90?????? 88折
****????? 10.25?????? 65折
****????? 56.14??????? 9折
****???? 104.65??????? 9折
****???? 100.30?????? 88折
****???? 297.15??????? 半價
****????? 26.75?????? 65折
****???? 130.62??????? 半價
****???? 240.28?????? 58折
****???? 270.62??????? 8折
****???? 115.87?????? 88折
****???? 247.34?????? 95折
****????? 73.21??????? 9折
****???? 101.00??????? 半價
****????? 79.54??????? 半價
****???? 278.44??????? 7折
****???? 199.26??????? 半價
****????? 12.97??????? 9折
****???? 166.30?????? 78折
****???? 125.50?????? 58折
****????? 84.98??????? 9折
****???? 113.35?????? 68折
****???? 166.57??????? 半價
****????? 42.56??????? 9折
****????? 81.90?????? 95折
****???? 131.78??????? 8折
****???? 255.89?????? 78折
****???? 109.17??????? 9折
****???? 146.69?????? 68折
****???? 139.33?????? 65折
****???? 141.16?????? 78折
****???? 154.74??????? 8折
****????? 59.42??????? 8折
****????? 85.44?????? 68折
****???? 293.70?????? 88折
****???? 261.79?????? 65折
****????? 11.30?????? 88折
****???? 268.27?????? 58折
****???? 128.29?????? 88折
****???? 251.03??????? 8折
****???? 208.39?????? 75折
****???? 128.88?????? 75折
****????? 62.06??????? 9折
****???? 225.87?????? 75折
****????? 12.89?????? 75折
****????? 34.28?????? 75折
****????? 62.16?????? 58折
****???? 129.12??????? 半價
****???? 218.37??????? 半價
****???? 289.69??????? 8折
--------------------
需要說明的是,88折指的是按標價的88%計算,而8折是按80%計算,余者類推。
特別地,半價是按50%計算。
請提交小明要從取款機上提取的金額,單位是元。
答案是一個整數,類似4300的樣子,結尾必然是00,不要填寫任何多余的內容。
解題思路:先用word查找替換掉沒有信息,處理為有用的信息,之后寫程序即可。
180.90 8.810.25 6.556.14 9104.65 9100.30 8.8297.15 526.75 6.5130.62 5240.28 5.8270.62 8115.87 8.8247.34 9.573.21 9101.00 579.54 5278.44 7199.26 512.97 9166.30 7.8125.50 5.884.98 9113.35 6.8166.57 542.56 981.90 9.5131.78 8255.89 7.8109.17 9146.69 6.8139.33 6.5141.16 7.8154.74 859.42 885.44 6.8293.70 8.8261.79 6.511.30 8.8268.27 5.8128.29 8.8251.03 8208.39 7.5128.88 7.562.06 9225.87 7.512.89 7.534.28 7.562.16 5.8129.12 5218.37 5289.69 8 #include<cstring> #include<cstdio> int main() {double ans,a,b;ans=0;while(scanf("%lf%lf",&a,&b)!=EOF){ans+=a*b*0.1;printf("%lf",ans);}return 0; }?
2標題:等差素數列
2,3,5,7,11,13,....是素數序列。
類似:7,37,67,97,127,157 這樣完全由素數組成的等差數列,叫等差素數數列。
上邊的數列公差為30,長度為6。
2004年,格林與華人陶哲軒合作證明了:存在任意長度的素數等差數列。
這是數論領域一項驚人的成果!
有這一理論為基礎,請你借助手中的計算機,滿懷信心地搜索:
長度為10的等差素數列,其公差最小值是多少?
注意:需要提交的是一個整數,不要填寫任何多余的內容和說明文字。
解題思路:直接暴力枚舉即可,跑了兩分鐘......電腦風扇呼呼地轉。
?
4標題:方格分割
6x6的方格,沿著格子的邊線剪開成兩部分。
要求這兩部分的形狀完全相同。
如圖:p1.png, p2.png, p3.png 就是可行的分割法。
試計算:
包括這3種分法在內,一共有多少種不同的分割方法。
注意:旋轉對稱的屬于同一種分割法。
請提交該整數,不要填寫任何多余的內容或說明文字。
解題思路:DFS搜索,這里搜索的是一條分割線。
#include<cstdio> #include<cstring> #include<cmath> #include<algorithm> using namespace std; int vis[7][7]; int ans=0; int dir[4][2]={{0,1},{0,-1},{1,0},{-1,0}}; int DFS(int x,int y) {int i,x1,y1;if(x==0||y==0||x==6||y==6)///搜索到邊界,說明形成了分割線 {ans++;return 0;}for(i=0;i<4;i++){x1=x+dir[i][0];y1=y+dir[i][1];if(x1<0||x1>6||y1<0||y1>6){continue;} if(!vis[x1][y1]){vis[x1][y1]=1;vis[6-x1][6-y1]=1;DFS(x1,y1);vis[x1][y1]=0;///回溯撤回標記 vis[6-x1][6-y1]=0;} }}int main(){memset(vis,0,sizeof(vis));vis[3][3]=1;DFS(3,3);printf("%d\n",ans/4);return 0;}?
?
5標題:取數位
求1個整數的第k位數字有很多種方法。
以下的方法就是一種。
// 求x用10進制表示時的數位長度
int len(int x){
?? ?if(x<10) return 1;
?? ?return len(x/10)+1;
}
?? ?
// 取x的第k位數字
int f(int x, int k){
?? ?if(len(x)-k==0) return x%10;
?? ?return _____________________;? //填空
}
?? ?
int main()
{
?? ?int x = 23574;
?? ?printf("%d\n", f(x,3));
?? ?return 0;
}
對于題目中的測試數據,應該打印5。
請仔細分析源碼,并補充劃線部分所缺少的代碼。
注意:只提交缺失的代碼,不要填寫任何已有內容或說明性的文字。
解題思路:這道題一看就是要讓我們來補充遞歸調用的代碼,這個題分析f函數,如果x用10進制表示時的數位長度和所求的一樣長,就返回個位數,如果不一樣長,那么應該截取到一樣長,也就是x/10。同時len()函數也是遞歸實現功能,這也提示了我們。
#include<cstdio> #include<cstring> #include<cmath> #include<algorithm> using namespace std; // 求x用10進制表示時的數位長度 int len(int x){if(x<10) return 1;return len(x/10)+1; }// 取x的第k位數字 int f(int x, int k){if(len(x)-k==0) return x%10;///取最后一位 return f(x/10,k); //填空 }int main() {int x = 23574;printf("%d\n", f(x,3));return 0; }?
6標題:最大公共子串
最大公共子串長度問題就是:
求兩個串的所有子串中能夠匹配上的最大長度是多少。
比如:"abcdkkk" 和 "baabcdadabc",
可以找到的最長的公共子串是"abcd",所以最大公共子串長度為4。
下面的程序是采用矩陣法進行求解的,這對串的規模不大的情況還是比較有效的解法。
請分析該解法的思路,并補全劃線部分缺失的代碼。
#include <stdio.h>
#include <string.h>
#define N 256
int f(const char* s1, const char* s2)
{
?? ?int a[N][N];
?? ?int len1 = strlen(s1);
?? ?int len2 = strlen(s2);
?? ?int i,j;
?? ?
?? ?memset(a,0,sizeof(int)*N*N);
?? ?int max = 0;
?? ?for(i=1; i<=len1; i++){
?? ??? ?for(j=1; j<=len2; j++){
?? ??? ??? ?if(s1[i-1]==s2[j-1]) {
?? ??? ??? ??? ?a[i][j] = __________________________;? //填空
?? ??? ??? ??? ?if(a[i][j] > max) max = a[i][j];
?? ??? ??? ?}
?? ??? ?}
?? ?}
?? ?
?? ?return max;
}
int main()
{
?? ?printf("%d\n", f("abcdkkk", "baabcdadabc"));
?? ?return 0;
}
?
解題思路:最長公共子序列的模板題,這里附上之前寫的博客https://www.cnblogs.com/wkfvawl/p/9362287.html
9標題: 分巧克力
??? 兒童節那天有K位小朋友到小明家做客。小明拿出了珍藏的巧克力招待小朋友們。
??? 小明一共有N塊巧克力,其中第i塊是Hi x Wi的方格組成的長方形。
??? 為了公平起見,小明需要從這 N 塊巧克力中切出K塊巧克力分給小朋友們。切出的巧克力需要滿足:
??? 1. 形狀是正方形,邊長是整數 ?
??? 2. 大小相同 ?
例如一塊6x5的巧克力可以切出6塊2x2的巧克力或者2塊3x3的巧克力。
當然小朋友們都希望得到的巧克力盡可能大,你能幫小Hi計算出最大的邊長是多少么?
輸入
第一行包含兩個整數N和K。(1 <= N, K <= 100000) ?
以下N行每行包含兩個整數Hi和Wi。(1 <= Hi, Wi <= 100000)
輸入保證每位小朋友至少能獲得一塊1x1的巧克力。? ?
輸出
輸出切出的正方形巧克力最大可能的邊長。
樣例輸入:
2 10 ?
6 5 ?
5 6 ?
樣例輸出:
2
資源約定:
峰值內存消耗(含虛擬機) < 256M
CPU消耗? < 1000ms
解題思路:我們知道,在1~100000之間的任何一個數x,將各個大塊的巧克力按照邊長為x的正方形進行切割,如果切割的塊數大于等于K,就能夠實現每個小朋友都有一份的目標。我們要找的是最大的那個x,而想要找到這個x我們不能暴力,那就需要對這個區間采用二分法來查找。
?
?
10標題: k倍區間
給定一個長度為N的數列,A1, A2, ... AN,如果其中一段連續的子序列Ai, Ai+1, ... Aj(i <= j)之和是K的倍數,我們就稱這個區間[i, j]是K倍區間。 ?
你能求出數列中總共有多少個K倍區間嗎? ?
輸入
-----
第一行包含兩個整數N和K。(1 <= N, K <= 100000) ?
以下N行每行包含一個整數Ai。(1 <= Ai <= 100000) ?
輸出
-----
輸出一個整數,代表K倍區間的數目。 ?
例如,
輸入:
5 2
1 ?
2 ?
3 ?
4 ?
5 ?
程序應該輸出:
6
資源約定:
峰值內存消耗(含虛擬機) < 256M
CPU消耗? < 2000ms
解題思路:這道題從題意中看出應該使用前綴和但一般的兩重循環來限制區間的方法必然會造成時間超限,這里因為有取模運算,實際上是有規律的。計算前綴和然后取余k, 如果前i項和取余k與前j項和取余k后相同,那么i到j這個區間和為k的倍數,因為余數相等,所以這個一定成立(sum[r] - sum[l-1])% k == 0,所以這個區間是符合條件的。
?
?
轉載于:https://www.cnblogs.com/wkfvawl/p/10551135.html
總結
以上是生活随笔為你收集整理的2017年第八届蓝桥杯【C++省赛B组】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: FJUT Home_W的拆分序列(DP)
- 下一篇: 【LeetCode】字符串 string