所謂刷題,最重要的就是細心
📌 題目描述
在 X 進制 中,每一數位的進制不固定。例如:
- 最低位 采用 2 進制,
- 第二位 采用 10 進制,
- 第三位 采用 8 進制,
則 X 進制數 321 的十進制值為:
3×(10×8)+2×8+1=65
現在,給定兩個以 X 進制表示的整數 A 和 B,它們的每一數位的進制上限為 N 進制,下限為 2 進制,你需要計算:
A?B
在 十進制下的最小可能值,并輸出 模 10^9+7 后的結果。
📌 輸入格式
- 第一行:一個正整數
N
(表示最高進制)。 - 第二行:一個正整數
Ma
(表示 X 進制數 A 的位數)。 - 第三行:
Ma
個用空格分隔的整數(表示 A 的各個位,從 高位到低位)。 - 第四行:一個正整數
Mb
(表示 X 進制數 B 的位數)。 - 第五行:
Mb
個用空格分隔的整數(表示 B 的各個位,從 高位到低位)。
📌 輸出格式
- 輸出 一個整數,表示 A - B 的最小可能值,轉換為十進制后模 10^9+7?的結果。
📌 輸入輸出示例
輸入
11 3 10 4 0 3 1 2 0
輸出
94
📌 題目說明
- 你需要 找到最小的進制分配方案,使得
A - B
最小:- 每一位的進制必須 ≥ max(1, A[i], B[i]) + 1(確保 A 和 B 的每一位都是合法的)。
- 每一位的進制不能小于 2(最小是二進制)。
- 最優解 是選擇 盡可能小的進制,這樣計算出的 A 和 B 的十進制值最小,從而
A - B
也最小。
- 進制計算方式
- 例如,若
A = [10, 4, 0]
,B = [1, 2, 0]
- 進制可以選擇:
d = [11, 5, 2]
- 計算: A10=10×(5×2)+4×2+0=108? B10?=1×(5×2)+2×2+0=14
- 最終
A - B = 108 - 14 = 94
。
- 例如,若
📌 約束條件
- 對于 30% 的數據:
- N≤10
- 1≤Ma,Mb≤8
- 對于 100% 的數據:
- 2≤N≤1000
- 1≤Ma,Mb≤100000
- 保證 A ≥ B
- 運行限制
- C++ / C / Java / Python3
- 最大運行時間:1s
- 最大運行內存:256MB
import os
import sys# 請在此輸入您的代碼if __name__=="__main__":mod = 1000000007N=int(input())Ma=int(input())A= list(map(int,input().split()))Mb=int(input())B= list(map(int,input().split()))for i in range(Ma-Mb):B.insert(0,0)result=0for i in range(Ma):if i==Ma-1:result= (1)*(result+A[i]-B[i])%modelse:result= (max(1,A[i+1],B[i+1])+1)*(result+A[i]-B[i])%modprint(result%mod)
字符遷移【算法賽】
題目描述
小藍最近獲得了一個長度為 N 的字符串 S,他對它愛不釋手。
小橋為了考驗小藍對字符串的處理能力,決定給他提出一個挑戰:她會進行 Q 次操作,每次操作給定三個整數 l, r, k,將 S 的第 l 個字符到第 r 個字符都循環右移 k 次。
字符右移的含義為:按照字母表順序進行移動,例如:
'a' 右移 1 次變為 'b';
'b' 右移 2 次變為 'd';
特別地,'z' 右移 1 次變回 'a'。
操作完成后,請輸出字符串 S 的最終結果。
輸入格式
第一行輸入兩個整數 N, Q
(1 ≤ N, Q ≤ 2×10<sup>5</sup>),表示字符串 S 的長度以及操作次數。
第二行輸入一個字符串 S,保證 S 只包含小寫字母。
接下來 Q 行,每行輸入三個整數 l, r, k
(1 ≤ l ≤ r ≤ N, 1 ≤ k ≤ 10<sup>9</sup>),表示一次操作:將 S 中第 l 個字符到第 r 個字符循環右移 k 次。
輸出格式
輸出一個字符串,表示操作完成后的 S。
輸入樣例
5 3
abcde
1 5 3
1 2 4
2 5 3
輸出樣例
hlijk
運行限制
Python3:最大運行時間 3s,最大運行內存 256M
import os
import sys# 請在此輸入您的代碼if __name__=="__main__":N,Q=map(int,input().split())S = list(input())n=len(S)d=[0]*(n+1)s=[0]*nfor i in range(Q):l,r,k=map(int,input().split())d[l-1]+=kd[r]-=kfor i in range(n):if i==0:s[i]=d[i]else:s[i]=s[i-1]+d[i]for i in range(n):S[i]= chr(( s[i] +( ord(S[i]) - ord('a') ))%26 + ord('a') )print("".join(S))
食堂?
題目描述
S 學校里一共有
a2??個兩人寢、
a3??個三人寢、
a4??個四人寢。食堂里有
b4 個四人桌和
b6??個六人桌。學校想要安排學生們在食堂用餐,并且滿足每個寢室里的同學都在同一桌就坐。請問這個食堂最多同時滿足多少同學用餐?
輸入格式
采用多組數據輸入。
輸入共?q+1 行:
-
第一行為一個正整數?q,表示數據組數。
-
后面?q?行,每行五個非負整數?a2,a3,a4,b4,b6,表示一組數據。
輸出格式
輸出共?q?行,每行一個整數,表示對應輸入數據的答案。
樣例輸入
2 3 0 1 0 1 0 2 2 1 1
樣例輸出
6 10
樣例說明
-
第一組數據:
-
僅有一個六人桌,最多安排三個兩人寢的同學就餐。
-
答案為?2+2+2=6。
-
-
第二組數據:
-
用一個六人桌安排兩個三人寢的同學,用一個四人桌安排一個四人寢的同學。
-
答案為?(3+3)+4=10。
-
評測用例規模與約定
-
20% 的評測用例:
-
保證?a2+a3+a4≤8。
-
-
100% 的評測用例:
-
保證?q≤100,b4+b6≤a2+a3+a4≤100。
-
運行限制
語言 | 最大運行時間 | 最大運行內存 |
---|---|---|
C++ | 1s | 256M |
C | 1s | 256M |
Java | 3s | 512M |
Python3 | 10s | 512M |
import os
import sys# 請在此輸入您的代碼if __name__=="__main__":q= int(input())for i in range(q):a2,a3,a4,b4,b6=map(int,input().split())total=0tmp=min(a4,b4)total+=tmp*4a4-=tmpb4-=tmptmp=min(a2,a4,b6)total+=tmp*6a2-=tmpa4-=tmpb6-=tmptmp=min(a3//2,b6)total+=tmp*6a3-=tmp*2b6-=tmptmp=min(a2//2,b4)total+=tmp*4a2-=tmp*2b4-=tmptmp=min(a2//3,b6)total+=tmp*6a2-=tmp*3b6-=tmptmp=min(a2,a3,b6)total+=tmp*5a2-=tmpa3-=tmpb6-=tmptmp=min(a4,b6)total+=tmp*4a4-=tmpb6-=tmptmp=min(a2//2,b6)total+=tmp*4a2-=tmp*2b6-=tmptmp=min(a3,b4)total+=tmp*3a3-=tmpb4-=tmptmp=min(a3,b6)total+=tmp*3a3-=tmpb6-=tmptmp=min(a2,b4)total+=tmp*2a2-=tmpb4-=tmptmp=min(a2,b6)total+=tmp*2a2-=tmpb6-=tmpprint(total)