题目地址
这道题本身不难,难在题目要求的格式上,所以新手多数会卡着格式不过关而不能AC。空白行就是在endl后还要endl一次,而且要在最后一次输出中不输出空白行就行了。
至于大数加法可以参考这份博客 大数专题
#include
#include
#include
#include
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;
}
题目地址
这道题是在《挑战程序设计竞赛》中看到的,每次看到这道题我都反思着要多个角度看题,当然角度是提前学习过的角度,不能异想天开。
而这道题便是换了一个角度看题,题中蚂蚁前进如果碰到另一只蚂蚁便会掉头,另一只蚂蚁也是。题意是要我们找到全部蚂蚁走出竿子的最长时间和最短时间。
每只蚂蚁的初始方向有两种,而很容易想到二进制枚举所有可能,然后模拟求时间最终找出最短和最长时间。但是蚂蚁数有 1 0 6 10^6 106所以不可能。那么如果两只蚂蚁相遇互相掉头其实就相当于互相穿过彼此(毕竟蚂蚁速度都一样),那么最长时间就是求最远离竿子边缘的距离,最短同理。那么每只蚂蚁的向左和向右中找出最大值便是最长时间,最小值便是最小时间,那么时间复杂度就是是O(n)了。
#include
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;
}
题目地址
走迷宫是标准的bfs,所以会就还得写的快,不会就跟要抓紧学。bfs需要队列用来储存每一步的邻点,从而达到由近及远。直到队列为空就是走到头了。
而这道题还要求输出这个最短路,所以还要保存走的路。
'''
代码就不说了,毕竟是模板题,嘿嘿
'''
题目地址
'''
模板题就不用题解了吧!!!
:)
'''
题目地址
此题是一道数学题,也是一道技巧题,也是不能直接算的,否则会超时的!!!
解题思路:设 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∗log10n−⌊n∗log10n⌋
所以最后d取整就是答案了,呼~,难,数学难!!
#include
#include
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;
}
题目地址
三个阵营,公主的人a、皇后的人b、还有看热闹的人c,公主的人包括公主,他们只会说真话,皇后的人只会说假话,看热闹的人就想说什么就说什么,所以要100%找到公主,那么看热闹的人就指定不上了,所以如果公主的人大于皇后的人和看热闹的人,那么公主就一定能找到,而如果公主的人只有一个,那么就一定是公主所以就不用问就可以知道,否则根据鸽笼原理,就得问 2 ∗ ( b + c ) + 1 2*(b+c)+1 2∗(b+c)+1次
#include
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;
}
题目地址
这是一道非常基础的博弈,只要看了相关的资料这题应该是没有问题的,只是有时候的确是这样的,看这对,方法也是这样的,但是就是WA,这样的情况也不是没有,我也时时为这种情况头疼,当然没办法,这种情况我们要么看看别人的,要么换思路。。
这道题很简单,就不多说,主要说一下结论,就是n%(m+1)这个m和1分别是可以摸到的最大值和最小值。
对于任意的p,q(p,q分别是可以摸的最大值和最小值)这个结论都是对的。即n%(p+q),这是一个循环,大家应该是会懂得。’
这里我要强推这篇blog 常见的几种博弈
#include
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;
}