賽時成績如下:
?
A. Round 99
題目描述
對于給定的五位整數,檢查其中是否含有數字 99;換句話說,檢查是否存在相鄰的兩個數位,其值均為 。
解題思路: 檢查相鄰的兩個數字是否均為9
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using pll = pair<ll, ll>;
void solve() {int n;cin >> n;string a = to_string(n);for (int i = 1; i < a.size(); i++) {if (a[i] == a[i - 1] && a[i] == '9') {cout << "YES" << '\n';return;}}cout << "NO" << '\n';
}
int main() {int t = 1;// cin>>t;while (t--) {solve();}return 0;
}
?B. 缺陷型電腦
題目描述
Tk 有一臺缺陷型電腦,它在輸出內容之前必須先加載 ASCII?表;
這臺電腦可以為每次輸入生成一個長度為 x?的 ASCII?表,該表包含編碼值從 1 到 x 的所有字符;現在給定一個僅由可見字符集合構成的字符串 s。請你計算:要輸出 s 中的所有字符,至少需要多長的 ASCII?表。
【名詞解釋】
可見字符集為 ASCII 碼在 33 到 126 范圍內的可見字符。您可以參閱下表獲得其詳細信息(您可能關注的內容是,這其中不包含空格、換行)。
解題思路:包含從1-x的所有字符, 同時表的長度為x
因此, 直接找出輸入字符中最大的即為答案?
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using pll = pair<ll, ll>;
void solve() {int n;string s;cin >> n >> s;int mx = *max_element(s.begin(), s.end());cout << mx << '\n';
}
int main() {int t;cin >> t;while (t--) {solve();}return 0;
}
?C.小苯的洞數構造
解題思路:
小苯對數字的 "洞數" 十分感興趣,即數字中含有的封閉圖形個數,如下是每個數位的 "洞數" 表:
現在小苯給定了一個整數 k,他希望你構造一個值最小的,滿足所有數位中的 "洞數" 總和恰好為 k 的正整數(不包含前導 0?),請你幫幫他吧。?
解題思路:
滿足由洞數構造出的值最小
?
1 洞:4,?6,?9
2 洞:8
0 洞:1,?2,?3,?5,?7?
為了讓生成的正整數數值最小,第一要點是“盡量少的位數”——位數少的數值更小“8”有 2 個洞,用它能最快湊洞數,減少總位數
余下的 1 個洞(如果目標洞數為奇數),用“4”來補;雖然“0”也是 1 洞,但不能出現在首位;在多位數里放“4”比放“6”“9”都更小
特殊情況
當?𝑘=0
k=0 時,需要一個“零洞”且最小的正整數,顯然是 “1”
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using pll = pair<ll, ll>;
void solve() {int k;cin >> k;if (k == 0) {cout << 1 << '\n';return;}int cnt = k / 2;if (k & 1) {cout << 4;}for (int i = 0; i < cnt; i++) {cout << 8;}cout << '\n';
}
int main() {int t;cin >> t;while (t--) {solve();}return 0;
}
?D.?前綴和
題目描述
小紅有一個由正整數組成的數組 a,但是她沒有告訴你數組中的元素具體是什么,你只知道這個數組的元素各不相同,且其前綴數組 s 對于給定的一個 x,其任意一項均滿足:,?對于數組的第 k 個元素,當 ?kx? 為偶數時,sk=a1+a2+?+ak? 也是偶數;
,?對于數組的第 k 個元素,當 ?kx? 為奇數時,sk=a1+a2+?+ak 也是奇數。
除此之外,你還知道這個數組是滿足條件的所有數組中字典序最小的。小紅現在來問你,這個數組中第 p 個元素是多少,你能快速的回答她嗎?
【名詞解釋】
字典序:從兩個數組的第一個元素開始逐個比較,直到找到第一個不同的元素,較小元素所在的數組的字典序較小。
解題思路: 以x為周期, 前面全是偶數, 最后一位是奇數
計算 a = ?p/x?:
這表示 p 所在的“塊”編號(每 x 個元素為一組)
判斷 p 是否是 x 的倍數:
如果 p % x == 0,說明 p 是當前塊的最后一個元素
否則,p 位于塊的中間
計算 a[p]:
如果 p 是塊的最后一個元素(p % x == 0),則 a[p] = 2a - 1
否則,a[p] = 2(p - a)
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using pll = pair<ll, ll>;
void solve() {ll x, p;cin >> x >> p;ll a = p / x;if (p % x == 0) {cout << 2 * a - 1 << '\n';} else {cout << 2 * (p - a) << '\n';}
}
int main() {int t;cin >> t;while (t--) {solve();}return 0;
}
? E.?小宇
題目描述
給定一個長度為 n 的數組 {a1,a2,…,an}。
你可以進行以下操作多次:
,?選擇一個整數 x,將所有滿足 ai=x 的元素分別修改為它們的下標 i;問 最少需要進行多少次操作,才能使數組變為嚴格單調遞增?
嚴格單調遞增:若數組 {b1,b2,…,bn} 對任意下標 i<ji<ji<j 都滿足 bi<bj,則稱其為嚴格單調遞增數組。
解題思路:
首先經過觀察可知,每個位置的數字一定不小于它的下標,且若進行了修改,一定是對一段前綴進行修改,因此只需要從后往前找到第一個需要修改的位置,并把前綴里面所有出現過的數字的值的出現的最大下標范圍內的數字都進行修改即可,注意,根據修改規則和分析,只需修改那些值不等于下標的位置即可,可用set去重?
public class Main{public static void main(String args[]){Scanner sc=new Scanner(System.in);for(int i=sc.nextInt();i!=0;i--){int n=sc.nextInt(),a[]=new int[n+5],maxIdx=0;Map<Integer,Integer> map=new HashMap<>();for(int j=1;j<=n;j++){a[j]=sc.nextInt();map.put(a[j],Math.max(j,map.getOrDefault(a[j],0)));}a[n+1]=(int)2e9;for(int j=n;j>0;j--){if(a[j]>=a[j+1]||a[j]<j){for(int k=1;k<=j;k++){if(a[k]!=k){maxIdx=Math.max(maxIdx,map.get(a[k]));}}break;}}Set<Integer> set=new HashSet<>();for(int j=1;j<=maxIdx;j++){if(a[j]!=j){set.add(a[j]);}}System.out.println(set.size());}}
}
?F.?漢堡豬豬分糖果
題目描述
漢堡豬豬有 n 顆糖果,他想把糖果全部分給 m 個小朋友。
每個小朋友至少要分到一顆糖果,否則他們會生氣。他想知道,如何分配才能讓所有小朋友分到的糖果數量的 按位與最大?
解題思路:
1.貪心策略:
從高位到低位檢查,優先保證高位的 1,因為高位的 1 對結果的影響更大
如果能分配所有小朋友的某一位為 1,就直接分配;否則,嘗試部分分配
2.對于每一位 j,計算分配 1 的最小糖果數 (1 << j) * m
如果糖果不足,嘗試部分分配,確保剩余的糖果可以滿足其他約束
import java.util.*;
public class Main{public static void main(String args[]){Scanner sc=new Scanner(System.in);for(int i=sc.nextInt();i!=0;i--){long n=sc.nextInt(),m=sc.nextInt(),ans=0;for(int j=30;j>=0;j--){long cur=(1L<<j)*m;if(n>=cur){//這一位可以全是1n-=cur;ans|=1<<j;}else{cur-=m;//先測試一下可否后邊全為1if(n>cur){//說明這一位后邊全為1的話,還有剩余,導致后邊的數字不應定按位與得到全1,那就想辦法使得后邊的數字盡可能大//n-k*(1<<j)<=costn-=(1<<j)*((n-cur-1)/(1<<j)+1);}}}System.out.println(ans);}}
}
?感謝大家的點贊和關注,你們的支持是我創作的動力!
?