1. 程式人生 > >【位元杯-C語言大賽】(2018)位元杯C語言大賽題解

【位元杯-C語言大賽】(2018)位元杯C語言大賽題解

第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;
}

後記

本人才疏學淺,若發現問題,望尊指正。