第六屆藍橋杯省賽 C/C++真題混搭題解(前9道)(2015年)

小魚雞湯時刻:點墨(老爸)曰:養精蓄銳,厚積薄發。

                        墨點兒(我)曰:老爸說的對哈哈!

1.隔行變色

Excel表的格子很多,爲了避免把某行的數據和相鄰行混淆,可以採用隔行變色的樣式。
小明設計的樣式爲:第1行藍色,第2行白色,第3行藍色,第4行白色,....
現在小明想知道,從第21行到第50行一共包含了多少個藍色的行。

請你直接提交這個整數,千萬不要填寫任何多餘的內容。

答案:15

 

2.立方尾不變(初步定範圍)

有些數字的立方的末尾正好是該數字本身。
比如:1,4,5,6,9,24,25,....

請你計算一下,在10000以內的數字中(指該數字,並非它立方後的數值),符合這個特徵的正整數一共有多少個。

請提交該整數,不要填寫任何多餘的內容。

答案:36
#include<iostream>
#include<cmath>
#define ll long long
using namespace std;
int main() {
	int ans=0;
	for(ll i=1; i<=10000; i++) {
		ll tmp=i*i*i;
		if(tmp%10000==i||tmp%1000==i||tmp%100==i||tmp%10==i||tmp==i) {
			ans++;
			cout<<i<<endl;
		}
	}
	cout<<ans;
	return 0;
}
以下是zh同學的代碼,覺得更條理清晰,贊一個!
#include<iostream>
using namespace std;
int main(){
	int sum=0;
	for(int i=1;i<=9;i++){
		if((i*i*i)%10==i)
		    sum++;
	}
	for(int i=10;i<=99;i++){
		if((i*i*i)%100==i)
		    sum++;
	}
	for(int i=100;i<=999;i++){
		if((i*i%1000*i)%1000==i)
		    sum++;
	}
	for(int i=1000;i<=9999;i++){
		if((i*i%10000*i)%10000==i) //爲了避免超出數據範圍,需要先mod 一下
		    sum++;
	}
	cout<<sum<<endl;
}

 

3.立方變自身

觀察下面的現象,某個數字的立方,按位累加仍然等於自身
1^3 = 1 
8^3  = 512    5+1+2=8
17^3 = 4913   4+9+1+3=17
...

請你計算包括1,8,17在內,符合這個性質的正整數一共有多少個?

請填寫該數字,不要填寫任何多餘的內容或說明性的文字。

 

答案:6
#include<iostream>
#include<cmath>
#define ll long long
using namespace std;
int main() {
	int ans=0;
	for(int i=1;i<10000;i++){
		ll tmp=i*i*i;
		int sum=0;
		while(tmp){
			sum+=tmp%10;
			tmp/=10;
		}
		if(sum==i){
			cout<<i<<' '<<i*i*i<<endl;
			ans++;
		}
	}
	cout<<ans;
	return 0;
}

 

4.九數分三組(初步確定範圍)

1~9的數字可以組成3個3位數,設爲:A,B,C,  現在要求滿足如下關係:
B = 2 * A
C = 3 * A

請你寫出A的所有可能答案,數字間用空格分開,數字按升序排列。

注意:只提交A的值,嚴格按照格式要求輸出。

答案:192 219 273 327
#include<iostream>
#include<cstring>
using namespace std;
int v[10];
bool judge(int a,int b,int c){
	memset(v,0,sizeof v);
	while(a){
		v[a%10]++;
		a/=10;
	}
	while(b){
		v[b%10]++;
		b/=10;
	}
	while(c){
		v[c%10]++;
		c/=10;
	}
	for(int i=1;i<=9;i++)
		if(v[i]!=1) return false;
	return true;
}
int main() {
	int ans=0;
	for(int i=111;i<=333;i++){
		if(judge(i,i*2,i*3)){
			cout<<i<<' '<<i*2<<' '<<i*3<<endl;
			ans++;
		}
	}
	cout<<ans;
	return 0;
}

 

5.串逐位和(簡單二分,注意含首不含尾)

給定一個由數字組成的字符串,我們希望得到它的各個數位的和。
比如:“368” 的諸位和是:17
這本來很容易,但爲了充分發揮計算機多核的優勢,小明設計瞭如下的方案:

int f(char s[], int begin, int end)
{
    int mid;
    if(end-begin==1) return s[begin] - '0';
    mid = (end+begin) / 2;
    return f(s,begin,mid)+f(s,mid,end);  //填空(包括頭不包括尾)
}
    
int main()
{
    char s[] = "4725873285783245723";
    printf("%d\n",f(s,0,strlen(s)));
    return 0;
}

你能讀懂他的思路嗎? 請填寫劃線部分缺失的代碼。

注意:只填寫缺少的部分,不要填寫已有代碼或任何多餘內容。

 

6.無窮分數(老朋友了)

無窮的分數,有時會趨向於固定的數字。
請計算【圖1.jpg】所示的無窮分數,要求四捨五入,精確到小數點後5位,小數位不足的補0。

請填寫該浮點數,不能填寫任何多餘的內容。

#include<cstdio>
#include<cmath>
using namespace std;
int main() {
	double sum=0;
	for(int i=100;i>=1;i--){
		sum=(1.0*i)/(i+sum);
		printf("%.5f\n",sum);
	}
        return 0;
}

 

 

7.奇妙的數字(解決方法同四題)

小明發現了一個奇妙的數字。它的平方和立方正好把0~9的10個數字每個用且只用了一次。
你能猜出這個數字是多少嗎?

請填寫該數字,不要填寫任何多餘的內容。

答案:69
#include<iostream>
#include<cstring>
using namespace std;
int v[10];
bool judge(int a,int b){
	memset(v,0,sizeof v);
	while(a){
		v[a%10]++;
		a/=10;
	}
	while(b){
		v[b%10]++;
		b/=10;
	}
	for(int i=0;i<=9;i++)
		if(v[i]!=1) return false;
	return true;
}
int main() {
	for(int i=40;i<=100;i++){
		if(judge(i*i,i*i*i))
			cout<<i<<' '<<i*i<<' '<<i*i*i<<endl;
	}
	return 0;
}

 

 

8.飲料換購(簡單模擬)

樂羊羊飲料廠正在舉辦一次促銷優惠活動。樂羊羊C型飲料,憑3個瓶蓋可以再換一瓶C型飲料,並且可以一直循環下去(但不允許暫借或賒賬)。

請你計算一下,如果小明不浪費瓶蓋,儘量地參加活動,那麼,對於他初始買入的n瓶飲料,最後他一共能喝到多少瓶飲料。

輸入:一個整數n,表示開始購買的飲料數量(0<n<10000)
輸出:一個整數,表示實際得到的飲料數

例如:
用戶輸入:
100
程序應該輸出:
149

用戶輸入:
101
程序應該輸出:
151


資源約定:
峯值內存消耗 < 256M
CPU消耗  < 1000ms


請嚴格按要求輸出,不要畫蛇添足地打印類似:“請您輸入...” 的多餘內容。

所有代碼放在同一個源文件中,調試通過後,拷貝提交該源碼。

注意: main函數需要返回0
注意: 只使用ANSI C/ANSI C++ 標準,不要調用依賴於編譯環境或操作系統的特殊函數。
注意: 所有依賴的函數必須明確地在源文件中 #include <xxx>, 不能通過工程設置而省略常用頭文件。

提交時,注意選擇所期望的編譯器類型。

#include<iostream>
#include<cmath>
using namespace std;
int main() {
	int n,sum,cur;
	cin>>n;
	sum=cur=n;
	while(cur>=3){
		sum+=cur/3;
		cur=cur/3+cur%3;
	}
	cout<<sum;
	return 0;
}

 

9.打印大X(純找規律題)——極簡主義  

小明希望用星號拼湊,打印出一個大X,他要求能夠控制筆畫的寬度和整個字的高度。
爲了便於比對空格,所有的空白位置都以句點符來代替。

要求輸入兩個整數m n,表示筆的寬度,X的高度。用空格分開(0<m<n, 3<n<1000, 保證n是奇數)
要求輸出一個大X

例如,用戶輸入:
3 9
程序應該輸出:
***.....***
.***...***.
..***.***..
...*****...
....***....
...*****...
..***.***..
.***...***.
***.....***

(如有對齊問題,參看【圖1.jpg】)

再例如,用戶輸入:
4 21
程序應該輸出
****................****
.****..............****.
..****............****..
...****..........****...
....****........****....
.....****......****.....
......****....****......
.......****..****.......
........********........
.........******.........
..........****..........
.........******.........
........********........
.......****..****.......
......****....****......
.....****......****.....
....****........****....
...****..........****...
..****............****..
.****..............****.
****................****

(如有對齊問題,參看【圖2.jpg】)

資源約定:
峯值內存消耗 < 256M
CPU消耗  < 1000ms


請嚴格按要求輸出,不要畫蛇添足地打印類似:“請您輸入...” 的多餘內容。

所有代碼放在同一個源文件中,調試通過後,拷貝提交該源碼。

 

以下爲自己發現規律的手稿(字跡略潦草,還請各位小夥伴們湊合看)

#include<iostream>
#include<string>
using namespace std;
string str[1005];
int main() {
	int m,n,mid,len;
	cin>>m>>n;
	mid=n/2;
	len=mid*2+m;
	string s(len,'.');
	string ss(m,'*');
	for(int i=0;i<=mid;i++){
		str[i]=s;
		str[i].replace(i,m,ss);
		str[i].replace(len-m -i,m,ss);
	}
	for(int i=0;i<=mid;i++)
		cout<<str[i]<<endl;
	for(int i=mid-1;i>=0;i--)
		cout<<str[i]<<endl;
	return 0;
}

 

 

10.災後重建

Pear市一共有N(<=50000)個居民點,居民點之間有M(<=200000)條雙向道路相連。這些居民點兩兩之間都可以通過雙向道路到達。這種情況一直持續到最近,一次嚴重的地震毀壞了全部M條道路。
震後,Pear打算修復其中一些道路,修理第i條道路需要Pi的時間。不過,Pear並不打算讓全部的點連通,而是選擇一些標號特殊的點讓他們連通。
Pear有Q(<=50000)次詢問,每次詢問,他會選擇所有編號在[l,r]之間,並且 編號 mod K  = C 的點,修理一些路使得它們連通。由於所有道路的修理可以同時開工,所以完成修理的時間取決於花費時間最長的一條路,即涉及到的道路中Pi的最大值。

你能幫助Pear計算出每次詢問時需要花費的最少時間麼?這裏詢問是獨立的,也就是上一個詢問裏的修理計劃並沒有付諸行動。

【輸入格式】
第一行三個正整數N、M、Q,含義如題面所述。
接下來M行,每行三個正整數Xi、Yi、Pi,表示一條連接Xi和Yi的雙向道路,修復需要Pi的時間。可能有自環,可能有重邊。1<=Pi<=1000000。

接下來Q行,每行四個正整數Li、Ri、Ki、Ci,表示這次詢問的點是[Li,Ri]區間中所有編號Mod Ki=Ci的點。保證參與詢問的點至少有兩個。

【輸出格式】
輸出Q行,每行一個正整數表示對應詢問的答案。

【樣例輸入】
7 10 4
1 3 10
2 6 9
4 1 5
3 7 4
3 6 9
1 5 8
2 7 4
3 2 10
1 7 6
7 6 9
1 7 1 0
1 7 3 1
2 5 1 0
3 7 2 1

【樣例輸出】
9
6
8
8

【數據範圍】
對於20%的數據,N,M,Q<=30
對於40%的數據,N,M,Q<=2000
對於100%的數據,N<=50000,M<=2*10^5,Q<=50000. Pi<=10^6. Li,Ri,Ki均在[1,N]範圍內,Ci在[0,對應詢問的Ki)範圍內。

 


資源約定:
峯值內存消耗 < 256M
CPU消耗  < 5000ms


請嚴格按要求輸出,不要畫蛇添足地打印類似:“請您輸入...” 的多餘內容。

所有代碼放在同一個源文件中,調試通過後,拷貝提交該源碼。

注意: main函數需要返回0
注意: 只使用ANSI C/ANSI C++ 標準,不要調用依賴於編譯環境或操作系統的特殊函數。
注意: 所有依賴的函數必須明確地在源文件中 #include <xxx>, 不能通過工程設置而省略常用頭文件。

提交時,注意選擇所期望的編譯器類型。

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章