总结:两个小时,过三道题,基本都是思维题,总体状态还不错
A. String Building
思路:计算字母的个数,当后面的字母和当前不同时判断当前的字母个数是否为1,当然这是个结论,因为字母a和b的个数都有2个和3个,因为2和3可相加得除1以外的任何数,所以只有当连续字母个数为1时不能组成
结论:2和3可以组成除1以外的所有正整数
#include<iostream>
using namespace std;
int main(){
int T;
cin>>T;
while(T--){
bool f=0;
int a=0,b=0;
string s;
cin>>s;
for(int i=0;i<s.size();i++){
if(s[i]=='a'){
a++;
if(s[i+1]!='a'){
if(a==1){
f=1;
}
a=0;
}
}
if(s[i]=='b'){
b++;
if(s[i+1]!='b'){
if(b==1){
f=1;
}
b=0;
}
}
}
if(f==1){
cout<<"NO"<<'\n';
}else{
cout<<"YES"<<'\n';
}
}
return 0;
}
B. Consecutive Points Segment
思路:分析各种情况,每种情况举出几个例子便可推出结论,计算每相邻两个数字差的和,只有三
种情况,距离差的和等于数的个数-1、相等或+1
#include<iostream>
using namespace std;
int main(){
int T;
cin>>T;
while(T--){
int n,x,t,ans=0;
cin>>n;
cin>>t;
for(int i=1;i<n;i++){
cin>>x;
ans+=x-t;
t=x;
}
if(ans==n-1||ans==n||ans==n+1){
cout<<"YES"<<'\n';
}else{
cout<<"NO"<<'\n';
}
}
return 0;
}
C. Dolce Vita
模拟只能快乐的TLE了~~~哈哈哈哈哈哈~~~
思路:推公式!!!不会算法,只会推公式。。。。。先对商品的价格进行排序,再求前缀和,可推出公式——当天可购买商品的数量=(总钱数-当天的前缀和+当天的天数+1)/当天的天数,再求和
7
1 2 2
6 4 2 ——每天的钱与前缀和的差
(6+1)/1 (4+2)/2) (2+3)/3——公式
7 3 1 ——求和
1 3 5 ——前缀和
2 5 7 ——第二天
#include<cstdio>
#include<algorithm>
#define int long long
using namespace std;
const int N=200005;
int a[N],b[N];
signed main(){
int T;
scanf("%lld",&T);
while(T--){
int n,x,ans=0,m;
scanf("%lld%lld",&n,&x);
for(int i=1;i<=n;i++){
scanf("%lld",&a[i]);
}
sort(a+1,a+1+n);
for(int i=1;i<=n;i++){
a[i]+=a[i-1];
if(x-a[i]<0){
break;
}
ans+=(x-a[i]+i)/i;
}
printf("%lld\n",ans);
}
return 0;
}
D. Insert a Progression
思路:绝对值有一个性质,假如有两个数a b,在a b之间插入一个大小介于a b之间的数,不会影响整体结果,假设nmax,nmin是原数组的最大值与最小值,那么对结果有影响的只有1 ~nmax-1和nmax +1~x,如果我们先插入1与x,其他数就不用考虑了,所以枚举一下插入1与x的位置即可
记得定义的时候要赋初始值!!!
#include<iostream>
#include<cmath>
#define int long long
using namespace std;
const int N=200005;
int a[N];
signed main(){
int T;
cin>>T;
while(T--){
int n,x,ans=0;
cin>>n>>x;
cin>>a[1];
int nmax=a[1],nmin=a[1];
for(int i=2;i<=n;i++){
cin>>a[i];
ans+=abs(a[i]-a[i-1]);
nmax=max(nmax,a[i]);
nmin=min(nmin,a[i]);
}
if(1<nmin){
ans+=min(min(a[1]-1,a[n]-1),2*(nmin-1));
}
if(x>nmax){
ans+=min(min(x-a[1],x-a[n]),2*(x-nmax));
}
cout<<ans<<'\n';
}
return 0;
}