題目
- A-這是一道簽到題
- B-你一定很熟悉,所以再熟悉一下
- C-模板題不僅得會還得快
- D-這也是模板題,練練手速吧
- E-思考數字是最美妙的
- F-我“一定一定”要見到公主
- G-有時會取模玩游戲更厲害
A-這是一道簽到題
題目地址
這道題本身不難,難在題目要求的格式上,所以新手多數會卡著格式不過關而不能AC,空白行就是在endl后還要endl一次,而且要在最后一次輸出中不輸出空白行就行了,
至于大數加法可以參考這份博客 大數專題
#include<iostream>
#include<vector>
#include<string>
#include<cstdio>
using namespace std;
string fir,sec;
vector<int>sum(vector<int>A,vector<int>B){
vector<int>C;
int flag = 0;
for(int i=0;i<A.size()||i<B.size();i++){
if(i<A.size()) flag+=A[i];
if(i<B.size()) flag+=B[i];
C.push_back(flag%10);
flag/=10;
}
if(flag) C.push_back(flag);
return C;
}
int main(){
int t,caseNo=0;
cin>>t;
while(t--){
caseNo++;
printf("Case %d:\n",caseNo);
vector<int>A,B,C;
cin>>fir>>sec;
cout<<fir<<" + "<<sec<<" = ";
for(int i=fir.size()-1;i>=0;i--) A.push_back(fir[i]-'0');
for(int i=sec.size()-1;i>=0;i--) B.push_back(sec[i]-'0');
C=sum(A,B);
for(int i=C.size()-1;i>=0;i--) cout<<C[i];
printf("\n");
if(t!=0) printf("\n");
}
return 0;
}
B-你一定很熟悉,所以再熟悉一下
題目地址
這道題是在《挑戰程式設計競賽》中看到的,每次看到這道題我都反思著要多個角度看題,當然角度是提前學習過的角度,不能異想天開,
而這道題便是換了一個角度看題,題中螞蟻前進如果碰到另一只螞蟻便會掉頭,另一只螞蟻也是,題意是要我們找到全部螞蟻走出竿子的最長時間和最短時間,
每只螞蟻的初始方向有兩種,而很容易想到二進制列舉所有可能,然后模擬求時間最終找出最短和最長時間,但是螞蟻數有
1
0
6
10^6
106所以不可能,那么如果兩只螞蟻相遇互相掉頭其實就相當于互相穿過彼此(畢竟螞蟻速度都一樣),那么最長時間就是求最遠離竿子邊緣的距離,最短同理,那么每只螞蟻的向左和向右中找出最大值便是最長時間,最小值便是最小時間,那么時間復雜度就是是O(n)了,
#include<cstdio>
using namespace std;
const int MAX_N=1e6+5;
int L,n;
int x[MAX_N];
int main(void){
int t;
scanf("%d",&t);
while(t--){
cin>>L>>n;
for(int i=0;i<n;i++) cin>>x[i];
int minT=0'
for(int i=0;i<n;++i)
minT=max(minT,min(x[i],L-x[i])); //每只螞蟻是同時出發的哦!
int maxT = 0;
for(int i=0;i<n;++i)
maxT=max(maxT,max(x[i],L-x[i]));
printf("%d %d\n",minT,maxT);
}
return 0;
}
C-模板題不僅得會還得快
題目地址
走迷宮是標準的bfs,所以會就還得寫的快,不會就跟要抓緊學,bfs需要佇列用來儲存每一步的鄰點,從而達到由近及遠,直到佇列為空就是走到頭了,
而這道題還要求輸出這個最短路,所以還要保存走的路,
'''
代碼就不說了,畢竟是模板題,嘿嘿🤭
'''
D-這也是模板題,練練手速吧
題目地址
'''
模板題就不用題解了吧!!!
:)
'''
E-思考數字是最美妙的
題目地址
此題是一道數學題,也是一道技巧題,也是不能直接算的,否則會超時的!!!
解題思路:設
n
n
=
d
?
1
0
k
?
1
(
k
表
示
n
n
的
位
數
,
d
表
示
為
一
個
浮
點
數
)
n^n=d*10^{k-1}(k表示n^n的位數,d表示為一個浮點數)
nn=d?10k?1(k表示nn的位數,d表示為一個浮點數)
所以
d
=
1
0
(
l
o
g
10
(
n
n
)
?
(
k
?
1
)
)
d=10^{(log_{10}(n^n)-(k-1))}
d=10(log10?(nn)?(k?1))
而
k
=
?
l
o
g
10
(
n
n
)
+
1
?
k= \lfloor log_{10}(n^n)+1 \rfloor
k=?log10?(nn)+1?
帶入上式
d
=
1
0
l
o
g
10
(
n
n
)
?
?
l
o
g
10
(
n
n
)
?
d=10^{log_{10}(n^n)- \lfloor log_{10}(n^n) \rfloor }
d=10log10?(nn)??log10?(nn)?
在化解一下
d
=
1
0
n
?
l
o
g
10
n
?
?
n
?
l
o
g
10
n
?
d=10^{n*log_{10}n- \lfloor n*log_{10}n \rfloor }
d=10n?log10?n??n?log10?n?
所以最后d取整就是答案了,呼~,難,數學難!!
#include<iostream>
#include<cmath>
using namespace std;
int main(){
int T,n;
double x=0.0;
cin>>T;
while(T--){
cin>>n;
printf("%d\n",(int)(pow(10,((n*log10((double)n)-(__int64)(n*log10(n)))))));
}
return 0;
}
F-我“一定一定”要見到公主
題目地址
三個陣營,公主的人a、皇后的人b、還有看熱鬧的人c,公主的人包括公主,他們只會說真話,皇后的人只會說假話,看熱鬧的人就想說什么就說什么,所以要100%找到公主,那么看熱鬧的人就指定不上了,所以如果公主的人大于皇后的人和看熱鬧的人,那么公主就一定能找到,而如果公主的人只有一個,那么就一定是公主所以就不用問就可以知道,否則根據鴿籠原理,就得問
2
?
(
b
+
c
)
+
1
2*(b+c)+1
2?(b+c)+1次
#include <iostream>
using namespace std;
int main(){
int a,b,c;
cin>>a>>b>>c;
if(a>(b+c)){
if(a==1) printf("YES\n0");
else printf("YES\n%d",2*(b+c)+1);
}else printf("NO\n");
return 0;
}
G-有時會取模玩游戲更厲害
題目地址
這是一道非常基礎的博弈,只要看了相關的資料這題應該是沒有問題的,只是有時候的確是這樣的,看這對,方法也是這樣的,但是就是WA,這樣的情況也不是沒有,我也時時為這種情況頭疼,當然沒辦法,這種情況我們要么看看別人的,要么換思路,,
這道題很簡單,就不多說,主要說一下結論,就是n%(m+1)這個m和1分別是可以摸到的最大值和最小值,
對于任意的p,q(p,q分別是可以摸的最大值和最小值)這個結論都是對的,即n%(p+q),這是一個回圈,大家應該是會懂得,’
這里我要強推這篇blog 常見的幾種博弈
#include<iostream>
using namespace std;
int main(){
int m,n;
int c;
cin>>c;
while(c--){
cin>>n>>m;
if(m>=n||(n%(m+1)!=0))
cout<<"first"<<endl;
else cout<<"second"<<endl;
}
return 0;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/256696.html
標籤:其他
上一篇:簡易計算器
