洛谷題型摘選(三)
文章目錄
一、P2249 【深基13.例1】查詢
1.題目描述
輸入 n個單調不減的(就是後面的數不小於前面的數字)非負整數,然後進行 m 次詢問。對於每次詢問,給出一個整數q,要求輸出這個數字在序列中第一次出現的編號,如果沒有找到的話輸出 -1 。
2.輸入格式
第一行 2 個整數 n 和 m,表示數字個數和詢問次數。
第二行 n 個整數,表示這些待查詢的數字。
第三行 m 個整數,表示詢問這些數字的編號,從 1 開始編號。
3.輸出格式
m 個整數表示答案。
4.輸入輸出樣例
> 輸入:
11 3
1 3 3 3 5 7 9 11 13 15 15
1 3 6
> 輸出:
1 2 -1
5.做題思路
這是一道比較簡單的二分法應用題,在看到有序陣列時就應該想到需要使用二分法,這道題的主要特點應該就是有序陣列中會出現多個相同資料.
所以就需要在寫二分法的時候把這個給考慮進去,就算找到的中值等於了目標值,也並不代表該中值為答案,可能中值前面的數和它時一樣的,所以需要繼續往前搜尋。
6.程式碼
#include <stdio.h>
#include <stdlib.h>
int Found(int* p, int flag, int head, int end);
#define N 1000000
#define M 100000
int a[N], b[M];
int main()
{
int n, m;
scanf_s("%d %d", &n, &m); /* 輸入數字個數n和詢問次數m */
for (int i = 0; i < n; i++) /* 輸入數字 */
scanf_s("%d", &a[i]);
for (int i = 0; i < m; i++)
{
scanf_s("%d", &b[i]); /* 輸入查詢的數字 */
printf("%d ", Found(a, b[i], 0, n - 1)); /* 輸出二分法函式返回值即為答案 */
}
return 0;
}
int Found(int* p, int flag, int head, int end) /* 定義二分法使用函式 */
{
int mid = 0;
while (head < end) /* 二分法主體 */
{
mid = (head + end) / 2;
if (flag <= p[mid]) end = mid;
else head = mid + 1;
}
if (flag == p[head]) return head + 1; /* 如果滿足條件,則說明找到該數字 */
else return -1; /* 否則輸出-1 */
}
二、P1914 凱撒密碼
1.題目描述
密碼是由原文字串(由不超過 50 個小寫字母組成)中每個字母向後移動 n (0≤n≤26)位形成的。z 的下一個字母是 a,如此迴圈。他現在找到了移動前的原文字串及 n,請你求出密碼。
2.輸入格式
第一行:n。第二行:未移動前的一串字母
3.輸出格式
一行,是此密碼
4.輸入輸出樣例
> 輸入:
1
qwe
> 輸出:
rxf
5.做題思路
剛看到這道題的時候直接就寫了,覺得應該一次就過了,但是測試的時候出了錯誤答案,當時就有些納悶,仔細看了會才發現這道題的高深之處
‘z’的值是122,計算機中1個字元佔1個位元組,也就是8位,其大小最大為2^7 - 1=127,如果給’z’向後移5位以上,它的值就會溢位,導致最後的結果錯誤,為了解決這個問題,需要先把字元的值縮小,保證在’z’+26時不會溢位,最後重置後,再把值放大。
6.程式碼
#include <stdio.h>
#include <stdlib.h>
int main()
{
char ch[50];
int n, i = 0;
scanf_s("%d", &n); /* 輸入位移量n */
scanf_s("%s", ch, 50); /* 輸入該字串 */
while (ch[i] != '\0') /* 讀取整個字串 */
{
ch[i] -= 'a' - 1 - n; /* 將字元的值先縮小,防止溢位 */
if (ch[i] > 26) ch[i] -= 26; /* 將超出'z'值的字母從頭開始,即'z'+ 1='a' */
ch[i] += 'a' - 1; /* 再將字元放大為原來的值 */
i++; /* 繼續讀取下一個字元 */
}
printf("%s", ch);
return 0;
}
- 在洛谷測試需要修改scanf_s函式,上述程式碼在VS2019中可正常執行,如果不修改上述函式,可能會編譯錯誤。
- scanf_s在讀入字元時需要填寫第三個形參,填寫內容是讀入字元的最大長度。即上述《凱撒密碼》中的scanf_s("%s", ch, 50),即最長讀入字串為50。
相關文章
- 洛谷——玩具謎題
- 洛谷八皇后問題
- 洛谷題單指南-字串-Test字串
- 洛谷-P9574 題解
- 洛谷-P9830 題解
- 洛谷
- 【洛谷OJ】【JAVA】P1036 選數Java
- 【題解】洛谷P1613: 跑路
- 洛谷P5057簡單題
- [題解][洛谷P3594] WIL
- [題解][洛谷P3584] LAS
- 洛谷 P3226 [HNOI2012] 集合選數 做題記錄
- C++洛谷P1036 選數DFSC++
- 20241201每日一題洛谷P1683每日一題
- 洛谷P10244 String Minimization 題解
- 20241029每日一題洛谷P1024每日一題
- 20241030每日一題洛谷P1147每日一題
- 20241016每日一題洛谷P1115每日一題
- 洛谷P1644跳馬問題
- 洛谷P2440 木材加工 題解
- 「雜題亂刷」洛谷 P2572
- 「雜題亂刷」洛谷 P4801
- 洛谷 P1208混合牛奶 題解
- [題解] [洛谷P1404] 平均數
- 洛谷P1072 Hankson的趣味題
- 洛谷T90444 密碼 題解密碼
- 洛谷P1957 做題筆記筆記
- 洛谷團隊
- 【題解】洛谷P3118: Moovie Mooving G
- [題解][洛谷P1578] 奶牛浴場
- 洛谷 P4829 kry loves 2048——題解
- 洛谷P1496 火燒赤壁【題解】
- [題解][洛谷P1136] 迎接儀式
- [題解] [洛谷 P1174] 打磚塊
- 洛谷題單指南-集合-P1621 集合
- 洛谷P2062 分隊問題(dp)
- 快速排序--洛谷卡TLE後最終我還是選擇了三向切割排序
- 洛谷死亡時間