【華為機試線上訓練】Day 8

HelloZEX發表於2018-08-07

21點遊戲

題目描述

問題描述:給出4個1-10的數字,通過加減乘除,得到數字為24就算勝利
輸入:
4個1-10的數字。[數字允許重複,但每個數字僅允許使用一次,測試用例保證無異常數字]
輸出:
true or false

輸入描述:

輸入4個int整數

輸出描述:

返回能否得到24點,能輸出true,不能輸出false

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
 
void check24(const vector<int> &nums, int index, double result, bool &isSuccess)
{
    if (index == 4)   //遞迴結束條件
    {
        if (abs(result - 24) < 1e-6)
            isSuccess = true;
        return;
    }
    for (int i = 0; i < 4; i++)
    {
        if (i == 0)
            check24(nums, index + 1, result + nums[index], isSuccess);
        else if (i == 1)
            check24(nums, index + 1, result - nums[index], isSuccess);
        else if(i==2)
            check24(nums, index + 1, result * nums[index], isSuccess);
        else
            check24(nums, index + 1, result / nums[index], isSuccess);
        if (isSuccess)
            return;
    }
}
 
int main()
{
    vector<int>nums(4);
    while (cin >> nums[0] >> nums[1] >> nums[2] >> nums[3])
    {
        sort(nums.begin(), nums.end());
        bool isSuccess = false;
        do {
            check24(nums, 0, 0, isSuccess);
            if (isSuccess)
                break;
        } while (next_permutation(nums.begin(), nums.end()));
        if (isSuccess)
            cout << "true" << endl;
        else
            cout << "false" << endl;       
 
    }
    return 0;
}


成績排序

題目描述

查詢和排序

題目:輸入任意(使用者,成績)序列,可以獲得成績從高到低或從低到高的排列,相同成績
      都按先錄入排列在前的規則處理。

   例示:
   jack      70
   peter     96
   Tom       70
   smith     67

   從高到低  成績            
   peter     96    
   jack      70    
   Tom       70    
   smith     67    

   從低到高

   smith     67  

   Tom       70    
   jack      70    
   peter     96      

輸入描述:

輸入多行,先輸入要排序的人的個數,然後分別輸入他們的名字和成績,以一個空格隔開

輸出描述:

按照指定方式輸出名字和成績,名字和成績之間以一個空格隔開

#include <iostream>
#include <vector>
#include <algorithm>
#include <string>
using namespace std;
struct student{
  string name;
    int score;
};
bool cmp0(const student &a, const student &b){
    // 從高到低排序
    return a.score > b.score;
}
bool cmp1(const student &a, const student &b){
    // 從低到高排序
    return a.score < b.score;
}
int main(){
    //freopen("in.txt", "r", stdin);
    //freopen("out.txt", "w", stdout);
    int N, type;
    while(cin >> N >> type){
        vector<student> stud(N);
         
        for(int i = 0; i < N; i ++){
            cin >> stud[i].name >> stud[i].score;
        }
        if(type == 0)
            stable_sort(stud.begin(), stud.end(), cmp0);
        else
            stable_sort(stud.begin(), stud.end(), cmp1);
         
        for(int i = 0; i < N; i ++){
            cout << stud[i].name << " " << stud[i].score << endl;
        }
    }
     
    return 0;
}


字串萬用字元

題目描述

問題描述:在計算機中,萬用字元一種特殊語法,廣泛應用於檔案搜尋、資料庫、正規表示式等領域。現要求各位實現字串萬用字元的演算法。
要求:
實現如下2個萬用字元:
*:匹配0個或以上的字元(字元由英文字母和數字0-9組成,不區分大小寫。下同)
?:匹配1個字元
輸入:
萬用字元表示式;
一組字串。
輸出:
返回匹配的結果,正確輸出true,錯誤輸出false

輸入描述:

先輸入一個帶有萬用字元的字串,再輸入一個需要匹配的字串

輸出描述:

返回匹配的結果,正確輸出true,錯誤輸出false

#include<iostream>
using namespace std;
  
bool match(char *str1, char *str2)
    {
    if(*str1 == '\0'  && *str2 == '\0')
        return true;
    else if(*str1 == '\0' || *str2 == '\0')
        return false;
    if(*str1 == '?')
        return match(str1+1, str2+1);
    else if(*str1 == '*')
        return match(str1+1, str2) || match(str1+1, str2+1) || match(str1, str2+1);
    else if(*str1 == *str2)
        return match(str1+1, str2+1);
    return false;
}
  
int main()
    {
    char str1[100], str2[100];
    while(cin>>str1>>str2)
        {
        if(match(str1, str2))
            cout<<"true"<<endl;
        else
            cout<<"false"<<endl;
    }
      
    return 0;
}

 

相關文章