目录
A: 月相
题意:
牛牛最近在观察月相,他把月亮的大小分为 0~15 这16 个大小等级,月亮会在每个月先每天放大1,从0缓慢变大到15,然后再每天减小1,从15逐渐变成0,以此循环往复。牛牛连续观察了2天月亮的大小,牛牛想知道下一天月亮的大小是多少。
思路:
分递减递增两种普通情况和折返处的特殊情况,输出下一个数即可。
代码:
#include<bits/stdc++.h>
using namespace std;
int main()
{ int a,b;
cin>>a>>b;
if(a>b)
{ if(b!=0) cout<<b-1;
else cout<<b+1;
}
else
{ if(b!=15) cout<<b+1;
else cout<<b-1;
}
}
B: 间隔
题意:
牛牛现在有一个从小到大排好序的整数序列A。他希望插入一些整数,使得相邻两两之间的差值一样大。牛牛想知道最少插入多少个整数才能满足要求,如果不能,则输出−1。
思路:
将相邻两个数的差存入元素差数组,求出数组元素的总的最大公约数,若为零则讨论原数组元素是否相等,相等则插入0个,不相等则无法达到目的;若不为零则用元素差数组除以最大公约数,求和输出。
代码:
#include<bits/stdc++.h>
using namespace std;
long long t,n,a[1000000],b[1000000],pp,pt,min1,sum,an,f(long long,long long);
int main()
{
cin>>t;
while(t--)
{ cin>>n;
pp=0;pt=0;min1=999999,sum=0;
for(int i=1;i<=n;i++)
cin>>a[i];
for(int i=1;i<n;i++)
{ if(a[i+1]-a[i]==0) pt=1;
if(a[i+1]-a[i]!=0)
{ pp=1;
b[i]=a[i+1]-a[i];
}
}
if(pt==1&&pp==0) cout<<"0";
else if(pt==1&&pp==1) cout<<"-1";
else
{ an=b[1];
for(int i=2;i<n;i++)
an=f(an,b[i]);
for(int i=1;i<n;i++)
sum+=b[i]/an-1;
cout<<sum;
}
cout<<"\n";
}
}
long long f(long long x,long long y)
{ long long a,b,c;
a=x>y?x:y;
b=x<y?x:y;
while(b!=0)
{ c=b;
b=a%b;
a=c;
}
return a;
}
H: 伞
题意:
Marser 记录下了雨伞旋转的角速度w(单位为 rad·s-1),半径r(单位为 m),以及雨伞边缘离地高度 h(单位为 m)。他要求你计算封闭图形的面积,其中,重力加速度 g 取 10 m·s-2
思路:
平抛运动求出s,结合r运用勾股定理求出所求图形的半径,输出面积。
代码:
#include<bits/stdc++.h>
using namespace std;
int main()
{ double w,r,h,t2,s2,R2,g=10,pi=3.14;
cin>>w>>r>>h;
t2=(2*h)/g;
s2=w*w*r*r*t2;
R2=r*r+s2;
printf("%.3lf",pi*R2);
}
I: Move Right
题意:
有4个正方形水平排列。您将获得一个长度为 4 的字符串 S,该字符串由 0 和 1 组成。
如果 S 的第 i 个字符是 1,则从左边开始的第 i 个方块中有一个人;
如果 S 的第 i 个字符为 0,则从左侧开始的第 i 个方块中没有人。现在,每个人都将同时移动到右侧的下一个正方形。通过这一举动,原本在最右边方块的人将消失。确定移动后每个方块中是否有人。
思路:
水题。。。
代码:
#include<bits/stdc++.h>
using namespace std;
int main()
{ string s;
cin>>s;
cout<<"0";
for(int i=0;i<s.length()-1;i++)
cout<<s[i];
}
J: Unique Nicknames
题意:
有n个人,每人一个姓和名,每人以姓或名其中之一作为昵称,问每人的昵称能否各不相同且不与其他人的姓或名相同。
思路:
用map记录每个人名和姓在总人数中出现的次数,若有人的姓和名均出现超过一次,则不能满足要求。
代码:
#include<bits/stdc++.h>
using namespace std;
string a[10000],b[10000];
map<string,int>mp;
int main()
{ int n,pt=0;
cin>>n;
for(int i=1;i<=n;i++)
{ cin>>a[i];
scanf(" ");
cin>>b[i];
mp[a[i]]++;
mp[b[i]]++;
}
for(int i=1;i<=n;i++)
if(mp[a[i]]>1&&mp[b[i]]>1) {pt=1;break;}
if(pt==0) cout<<"Yes";
else cout<<"No";
}
K: 1 2 1 3 1 2 1
题意:
Sn(n 是大于或等于 2 的整数)是通过连接 Sn-1, n, Sn-1得到的序列,给出n,打印Sn。
思路:
循环更新,用vector记录上一次的和这一次的两个序列,其中用到insert()函数在一个vector的特定位置插入另一个vector的特定段。
代码:
#include<bits/stdc++.h>
using namespace std;
vector<int>p,pp;
int main()
{ int n;
cin>>n;
p.push_back(1);
for(int i=2;i<=n;i++)
{ pp.clear();
pp.insert(pp.begin(),p.begin(),p.end());
p.push_back(i);
p.insert(p.end(),pp.begin(),pp.end());
}
vector<int>::iterator it;
if(n==1) cout<<"1";
else
{ for(it=p.begin();it!=p.end();it++)
cout<<*it<<" ";
}
}