vjudge比赛题解

题目

      • A-这是一道签到题
      • B-你一定很熟悉,所以再熟悉一下
      • C-模板题不仅得会还得快
      • D-这也是模板题,练练手速吧
      • E-思考数字是最美妙的
      • F-我“一定一定”要见到公主
      • G-有时会取模玩游戏更厉害

A-这是一道签到题

题目地址
这道题本身不难,难在题目要求的格式上,所以新手多数会卡着格式不过关而不能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;
}

B-你一定很熟悉,所以再熟悉一下

题目地址
这道题是在《挑战程序设计竞赛》中看到的,每次看到这道题我都反思着要多个角度看题,当然角度是提前学习过的角度,不能异想天开。
而这道题便是换了一个角度看题,题中蚂蚁前进如果碰到另一只蚂蚁便会掉头,另一只蚂蚁也是。题意是要我们找到全部蚂蚁走出竿子的最长时间和最短时间。
每只蚂蚁的初始方向有两种,而很容易想到二进制枚举所有可能,然后模拟求时间最终找出最短和最长时间。但是蚂蚁数有 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;
}

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=d10k1(knn,d)
所以 d = 1 0 ( l o g 10 ( n n ) − ( k − 1 ) ) d=10^{(log_{10}(n^n)-(k-1))} d=10(log10(nn)(k1))
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=10nlog10nnlog10n
所以最后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;
}

F-我“一定一定”要见到公主

题目地址
三个阵营,公主的人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;
}

G-有时会取模玩游戏更厉害

题目地址
这是一道非常基础的博弈,只要看了相关的资料这题应该是没有问题的,只是有时候的确是这样的,看这对,方法也是这样的,但是就是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;
}

你可能感兴趣的:(笔记,算法,c++,acm竞赛)