【華為機試線上訓練】Day4
題目描述
開發一個座標計算工具, A表示向左移動,D表示向右移動,W表示向上移動,S表示向下移動。從(0,0)點開始移動,從輸入字串裡面讀取一些座標,並將最終輸入結果輸出到輸出檔案裡面。
輸入:
合法座標為A(或者D或者W或者S) + 數字(兩位以內)
座標之間以;分隔。
非法座標點需要進行丟棄。如AA10; A1A; $%$; YAD; 等。
下面是一個簡單的例子 如:
A10;S20;W10;D30;X;A1A;B10A11;;A10;
處理過程:
起點(0,0)
+ A10 = (-10,0)
+ S20 = (-10,-20)
+ W10 = (-10,-10)
+ D30 = (20,-10)
+ x = 無效
+ A1A = 無效
+ B10A11 = 無效
+ 一個空 不影響
+ A10 = (10,-10)
結果 (10, -10)
輸入描述:
一行字串
輸出描述:
最終座標,以,分隔
#include<iostream>
#include<string>
#include<cstddef> //std::size_t
using namespace std;
int main()
{
string str;
while(cin>>str){
pair<int,int> point(0,0); //point.first point.second
size_t found = str.find_first_of(';'); //找到第一個';'的位置
int start = 0;
while(found!=string::npos){
string s1 = str.substr(start,found-start);
//cout << s1 << endl;
start = found+1;
found = str.find_first_of(';',found+1);
if(s1.size()>1 && s1.size()<=3){ //合法的字元個數:2或3
char c = s1[0];
int n = 0;
int invalid = 0; //數字為是否非法
for(int i=1; i<s1.size(); ++i){ //數字位判斷與提取,A1A
if(s1[i]>='0'&&s1[i]<='9')
n = n*10 + (s1[i]-'0');
else{
invalid=1;
break;
}
}
if(invalid==0){
switch(c)
{
case 'A': {point.first-=n;break;}
case 'D': {point.first+=n;break;}
case 'W': {point.second+=n;break;}
case 'S': {point.second-=n;break;}
}
}
}
}
cout << point.first << ',' << point.second <<endl;
}
return 0;
}
題目描述
請解析IP地址和對應的掩碼,進行分類識別。要求按照A/B/C/D/E類地址歸類,不合法的地址和掩碼單獨歸類。
所有的IP地址劃分為 A,B,C,D,E五類
A類地址1.0.0.0~126.255.255.255;
B類地址128.0.0.0~191.255.255.255;
C類地址192.0.0.0~223.255.255.255;
D類地址224.0.0.0~239.255.255.255;
E類地址240.0.0.0~255.255.255.255
私網IP範圍是:
10.0.0.0~10.255.255.255
172.16.0.0~172.31.255.255
192.168.0.0~192.168.255.255
子網掩碼為前面是連續的1,然後全是0。(例如:255.255.255.32就是一個非法的掩碼)
本題暫時預設以0開頭的IP地址是合法的,比如0.1.1.2,是合法地址
輸入描述:
多行字串。每行一個IP地址和掩碼,用~隔開。
輸出描述:
統計A、B、C、D、E、錯誤IP地址或錯誤掩碼、私有IP的個數,之間以空格隔開。
懵逼狀態
#include <stdlib.h>
#include <iostream>
#include <vector>
#include <string>
#include <sstream>
using namespace std;
vector<string> split(string str, char del){
stringstream ss(str);
string tok;
vector<string> ret;
while(getline(ss, tok, del)){
ret.push_back(tok);
}
return ret;
}
bool IPisvalid(vector<string> svec){
if(svec.size() != 4){
return false;
}
return true;
}
bool Maskisvalid(vector<string> svec){
bool zero = false;
if(svec.size() != 4){
return false;
}
for(int i = 0; i < 4; i++){
if(zero == false){
if(atoi(svec[i].c_str()) != 255){
if(atoi(svec[i].c_str()) != 0 &&
atoi(svec[i].c_str()) != 128 &&
atoi(svec[i].c_str()) != 192 &&
atoi(svec[i].c_str()) != 224 &&
atoi(svec[i].c_str()) != 240 &&
atoi(svec[i].c_str()) != 248 &&
atoi(svec[i].c_str()) != 252 &&
atoi(svec[i].c_str()) != 254){
return false;
}else{
zero = true;
}
}
}else{
if(atoi(svec[i].c_str()) != 0){
return false;
}
}
}
if(atoi(svec[3].c_str()) == 255){
return false;
}
return true;
}
int main(){
vector<int> ret(7, 0);
string str;
vector<string> svec;
vector<string> ip;
vector<string> mask;
while(getline(cin, str)){
svec = split(str, '~');
ip = split(svec[0], '.');
mask = split(svec[1], '.');
if(Maskisvalid(mask) && IPisvalid(ip)){
if (atoi(ip[0].c_str()) >= 1 && atoi(ip[0].c_str()) <= 126){
++ret[0];
if (atoi(ip[0].c_str()) == 10)
++ret[6];
}else if (atoi(ip[0].c_str()) >= 128 && atoi(ip[0].c_str()) <= 191){
++ret[1];
if (atoi(ip[0].c_str()) == 172){
if (atoi(ip[1].c_str()) >= 16 && atoi(ip[1].c_str()) <= 31)
++ret[6];
}
}
else if (atoi(ip[0].c_str()) >= 192 && atoi(ip[0].c_str()) <= 223){
++ret[2];
if (atoi(ip[0].c_str()) == 168)
++ret[6];
}
else if (atoi(ip[0].c_str()) >= 224 && atoi(ip[0].c_str()) <= 239){
++ret[3];
}
else if (atoi(ip[0].c_str()) >= 240 && atoi(ip[0].c_str()) <= 255){
++ret[4];
}
}else{
ret[5]++;
}
}
cout << ret[0] << " " << ret[1] << " " << ret[2] << " " << ret[3] << " " << ret[4] << " " << ret[5] << " "<< ret[6] << endl;
return 0;
}
題目描述
計算最少出列多少位同學,使得剩下的同學排成合唱隊形
說明:
N位同學站成一排,音樂老師要請其中的(N-K)位同學出列,使得剩下的K位同學排成合唱隊形。
合唱隊形是指這樣的一種隊形:設K位同學從左到右依次編號為1,2…,K,他們的身高分別為T1,T2,…,TK, 則他們的身高滿足存在i(1<=i<=K)使得T1<T2<......<Ti-1<Ti>Ti+1>......>TK。
你的任務是,已知所有N位同學的身高,計算最少需要幾位同學出列,可以使得剩下的同學排成合唱隊形。
輸入描述:
整數N
輸出描述:
最少需要幾位同學出列
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
// 基本思路,兩遍最長遞增子序列,並找和最大
/*
來說一下我的思路,兩遍最長遞增子序列,第一遍從左往右,第二遍從右往左,然後把兩遍動態規劃的結果相加,取最大的那個,比如8 186 186 150 200 160 130 197 200,第一遍dp的結果是 1 1 1 2 2 1 3 4,第二遍dp的結果為3 3 2 3 2 1 1 1,那麼相加最大是5,所以需要出列的同學個數就是8-5+1=4.程式碼如下:
*/
int main(void)
{
int n;
while (cin >> n)
{
int tmp;
vector<int> queue;
vector<int> dp_1(n, 1);
vector<int> dp_2(n, 1);
for (int i = 0; i < n; ++i)
{
cin >> tmp;
queue.push_back(tmp);
}
// 第一遍dp
for (int i = 0; i < n; ++i)
{
for (int j = i - 1; j >= 0; --j)
{
if (queue[i] > queue[j] && dp_1[i] < dp_1[j] + 1)
dp_1[i] = dp_1[j] + 1;
}
}
std::reverse(queue.begin(), queue.end());
// 第二遍dp
for (int i = 0; i < n; ++i)
{
for (int j = i - 1; j >= 0; --j)
{
if (queue[i] > queue[j] && dp_2[i] < dp_2[j] + 1)
dp_2[i] = dp_2[j] + 1;
}
}
std::reverse(dp_2.begin(), dp_2.end());
int max = -1;
int sum;
for (int i = 0; i < n; ++i)
{
sum = dp_1[i] + dp_2[i];
if (sum > max)
{
max = sum;
}
}
cout << n - max + 1 << endl;
}
return 0;
}
相關文章
- 【華為機試線上訓練】Day 10
- 【華為機試線上訓練】Day 11
- 【華為機試線上訓練】Day 6
- 【華為機試線上訓練】Day 7
- 【華為機試線上訓練】Day 8
- 【華為機試線上訓練】Day 9
- 【華為機試線上訓練】Day1
- 【華為機試線上訓練】Day2
- 【華為機試線上訓練】Day3
- 華為部分線上測試題
- 雲端開爐,線上訓練,Bert-vits2-v2.2雲端線上訓練和推理實踐(基於GoogleColab)Go
- 華為機試 (11/8)
- 華為鯤鵬HCIA考試-練習05
- 華為freebuds耳機藍芽搜尋不到怎麼辦 華為freelace連線不上藍芽
- k線訓練營排名
- 史丹佛DAWNBench:華為雲ModelArts深度學習訓練全球最快深度學習
- 20240927 隨機訓練隨機
- 機率期望訓練
- CSAO×虎符安全訓練營 強強聯合,重磅上線
- 手把手教你基於華為雲,實現MindSpore模型訓練模型
- 牛客網--華為機試題
- 華為機試-取近似值
- 華為雲在香港為大模型訓練推理提供即開即用澎湃算力大模型
- 教育培訓機構試水線上教育平臺搭建的可行性
- 華為昇騰訓練營筆記-Ascend C運算元開發筆記
- 24暑假集訓day4上午&下午
- 小雞老師華為版終於上線華為應用市場
- 線上教育培訓機構如何推廣自己
- 華為機試題刷題總結
- Day4 備戰CCF-CSP練習
- 華為手機如何連線到電腦
- 新方案上線,華為為何加碼雲遊戲?遊戲
- MinIO線上故障演練
- 與其感慨模型難訓練,不如試試 AutoNLP模型
- 華為帳號自擬形象上線 打造手機裡的另一個你
- 一步一步教你線上免費訓練機器學習模型(啟用GPU和TPU)機器學習模型GPU
- 華為B5手環怎麼連線手機?華為手環B5連線手機操作教程
- 機器學習的訓練集機器學習