A
先放代码:
#include<bits/stdc++.h>usingnamespacestd;intmain(){string a,b;cin>>a>>b,cout<<"A"<<b[0]<<"C";return0;}初学者看不懂系列。想要理解这段代码,首先需要了解cin \text{cin}cin在输入string \text{string}string类型时的工作原理。cin \text{cin}cin输入时,会自动在空格处停下,不再接受空格后的内容。举个例子:
输入:zhujianheng AK IOI,如果用以下代码,会输出zhujianheng。
#include<bits/stdc++.h>usingnamespacestd;intmain(){string a;cin>>a;cout<<a;return0;}这就是理解的唯一难点了。
B
这道题要求a , b , x ≤ 10 18 a,b,x\leq 10^{18}a,b,x≤1018,所以本题不能使用任何循环结构,不然有可能导致本题的时间复杂度变为O ( n ) O(n)O(n),其中n nn的数量级为n ≤ 10 18 n\leq 10^{18}n≤1018。
但是循环结构我们也要试一试,毕竟确实可以很好的练习一下。
思路很简单,就是从头到尾枚举一遍。
#include<bits/stdc++.h>usingnamespacestd;typedeflonglongll;ll a,b,x,ans;intmain(){cin>>a>>b>>x;for(ll i=a;i<=b;i++)if(i%x==0)ans++;cout<<ans;return0;}还有一种循环,是稍微剪了剪枝的版本,思路就是有总个数 x \frac{\text{总个数}}{x}x总个数个在后半段区间内的满足条件的个数,再找到前面一部分区间里的个数,相加即可。
#include<bits/stdc++.h>usingnamespacestd;typedeflonglongll;ll a,b,x,ans;intmain(){cin>>a>>b>>x;if(a==b)cout<<(a%x==0);else{ll num=b-a+1;while(num%x!=0){if(a%x==0)ans++;a++,num--;}ans+=num/x;cout<<ans;}return0;}最后就是正确答案,这个其实是前缀和的思路,求一段区间[ a , b ] [a,b][a,b]里满足条件的个数,即求[ 0 , b ] [0,b][0,b]中满足条件的个数去掉[ 0 , a − 1 ] [0,a-1][0,a−1]中满足条件的个数。于是就出了结论。注意特判a = 0 a=0a=0的情况,此时就不会有[ 0 , a − 1 ] [0,a-1][0,a−1]这个区间了。
#include<bits/stdc++.h>usingnamespacestd;typedeflonglongll;intmain(){ll a,b,x;cin>>a>>b>>x;if(a==0)cout<<b/x+1;elsecout<<b/x-(a-1)/x;return0;}C
简单地按照题意模拟即可,找到每组两个数的差,使用差分的方法解题。
#include<bits/stdc++.h>usingnamespacestd;typedeflonglongll;ll n,x,a[100009],ans;intmain(){cin>>n>>x;for(ll i=0;i<n;i++)cin>>a[i];for(ll i=0;i<n;i++)if(a[i]>x)ans+=a[i]-x,a[i]=x;for(ll i=0;i<n-1;i++)if(a[i]+a[i+1]>x){ll t=a[i]+a[i+1]-x;ans+=t,a[i+1]-=t;}cout<<ans;return0;}D
没啥好说的,纯纯找规律题,跟出题人脑电波对上才能做。快捷一点的办法就是直接手动模拟样例,找出规律就行,注意边界情况。
#include<bits/stdc++.h>usingnamespacestd;intmain(){string s;cin>>s;intn=s.size();if(s[0]!=s[n-1])cout<<"First";else{if(n%2)cout<<"Second";elsecout<<"First";}return0;}