【位元杯-C語言大賽】(2018)位元杯C語言大賽題解
阿新 • • 發佈:2019-01-25
第0題
題意
給出一段字串和一個整數n,輸出在字串中第一次出現n次的字元;
例如: abbbcdeee 3 → b
題解
顯然,遍歷字串時用count()函式檢測該字元的數量,如果等於n,則輸出
程式碼
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n,i;
bool vis[300];//記錄該字元是否被訪問過
string str;
cin >> str >> n;
int len = str.size();
for (i = 0;i < len; i++){
if(vis[(int)str[i]] == false){
vis[(int)str[i]] = true;
if(count(str.begin(),str.end(),str[i]) == n){
cout << str[i] << endl;
break;
}
}
}
if(len == i) cout << "-1" << endl;
return 0;
}
第1題
題意
題目是要輸出一個蛇形上三角矩陣
有多組輸入樣例輸入:
5
輸出
1 3 6 10 15
2 5 9 14
4 8 13
7 12
11
題解
設矩陣第一個元素是從第0行第0列開始的;
我們可以觀察到,對於第一列,a[i][0] = a[i][0] + i;
然後我們在觀察每一行除了第一個元素以外,a[i][j] = a[i][j - 1] + i + j + 1 (i != 0);
程式碼
#include<bits/stdc++.h>
using namespace std;
#define maxn 205
int a[maxn][maxn],n;
int main()
{
while(cin >> n){
for(int i = 0;i < n;i++) fill(a[i],a[i] + n,0);
a[0][0] = 1;
for(int i = 0;i < n; i++){
if(i != 0) a[i][0] = a[i - 1][0] + i;
cout << a[i][0];
for(int j = 1;j < n - i; j++){
a[i][j] = a[i][j - 1] + i + j + 1;
cout << " " <<a[i][j];
}
cout << endl;
}
}
return 0;
}
第2題
題意
第一行輸入一個數字n,接下來有n個整數,如果有一個數字出現次數超過n的一半,則輸出。否則,輸出”-1”。
題解
這道題可以用標準模板庫的map來做,建立一個”數字 → 出現次數”的對映。
即map
程式碼
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n,k,x = 0;
cin >> n;
map<int,int> m;
for(int i = 0;i < n; i++){
cin >> k;
if(++m[k] > n/2) x = k;
}
cout << x << endl;;
return 0;
}
第3題
題意
有n個相同蘋果和k個相同盤子,問有多少種不同的擺法。
例如 7 3 → 8;
樣例中,4 1 2和4 2 1 視為同一種。部分盤子可以為空。
題解
在數學中,我們可以發現,如果要得到唯一不同的情況,需要第i個盤子裝的水果不比第i - 1個盤子多,否則就會造成重複。
例如:7 0 0
6 1 0
5 2 0
5 1 1
4 3 0
4 2 1
3 3 1
3 2 2但是,如果出現
4 1 2
4 0 3
3 1 3類似的情況,就會發現存在重複,以為某一個元素存在前一個元素比自身要小。
所以我們用搜索來排除這種干擾;
程式碼
#include<bits/stdc++.h>
using namespace std;
int n,k,cnt = 0;
void dfs(int x,int sum,int num){
if(num > k){
if(sum == n) cnt++;
return;
}
for(int i = x;i >= 0;i--)
dfs(i,i + sum,num + 1);
}
int main()
{
cin >> n >> k;
dfs(n,0,1);
cout << cnt << endl;
return 0;
}
後記
本人才疏學淺,若發現問題,望尊指正。