1.握手问题
思维:
对于第一个人来说 除了自己以外要跟其他49人握手 所以第一个是49 //对于第二个人来说 第一个人主动跟我握手了 有一次不算 所以第二个是48.。。 //以此类推 第43个人就是7 到了最后七个人呢 因为互相都没有握手 并且7个人都被前面的人握过手了 所以都是0
#include<bits/stdc++.h>
#define int long long
using namespace std;
signed main()
{
int sum=0;
for(int i=49;i>=7;i--)
{
sum+=i;
}
cout<<sum<<endl;
return 0;
}
2.小球反弹
想象延长矩形
#include<bits/stdc++.h>
#define int long long
using namespace std;
signed main()
{
int t=1,x=343720,y=233333;
while(1)
{
if(15*t%x==0 && 17*t%y==0)
{
break;
}
t++;
}
printf("%.2lf",2*sqrt(15*t*15*t+17*t*17*t));
return 0;
}
3.好数
模拟题,模拟题目意思即可
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,sum=0;
bool check(int x)
{
vector<int>a;
while(x>0)
{
a.push_back(x%10);
x/=10;
}
for(int i=0; i<a.size(); i++)
{
if((i+1)%2!=0 && a[i]%2==0) //奇数位不为奇数
{
return false;
}
else if((i+1)%2==0 && a[i]%2!=0) //偶数位不为偶数
{
return false;
}
}
return true;
}
signed main()
{
cin>>n;
for(int i=1; i<=n; i++)
{
if(check(i))
{
sum++;
}
}
cout<<sum<<endl;
return 0;
}
4.R 格式
本身是高精度问题,不过我就会下面方法,能过(40%)
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n;
long double d;
signed main()
{
cin>>n>>d;
printf("%.Lf\n",pow(2,n)*d);
return 0;
}
5.宝石组合
推导公式,最后得出结论:s=gcd(Ha,Hb,Hc); 下面代码未进行优化时间复杂度
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e5+10;
int n,h[N];
vector<int>nums;
signed main()
{
cin>>n;
for(int i=0; i<n; i++)
{
cin>>h[i];
}
sort(h,h+n);
int max1=0;
for(int i=0; i<n; i++)
{
for(int j=i+1; j<n; j++)
{
for(int k=j+1; k<n; k++) //i,j,k
{
int t=__gcd(__gcd(h[i],h[j]),h[k]);
if(t>max1)
{
nums.clear();
max1=t;
nums.push_back(h[i]);
nums.push_back(h[j]);
nums.push_back(h[k]);
}
}
}
}
for(int i=0;i<nums.size();i++)
{
cout<<nums[i]<<" ";
}
return 0;
}
6.拔河
//题目意思是可以选择一部分连续的同学(非全选)
//枚举所有队伍可能的值,排序后最小的 两相邻队伍的差值 即为结果(若两数的差最小,其排序后一定相邻)
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,a[1010];
vector<int>nums;
signed main()
{
cin>>n;
for(int i=0;i<n;i++) cin>>a[i];
for(int i=0;i<n;i++)
{
int temp=0;
for(int j=i;j<n;j++)
{
temp+=a[j];
nums.push_back(temp);
}
}
sort(nums.begin(),nums.end());
int min1=LONG_MAX;
for(int i=1;i<nums.size();i++)
{
min1=min(min1,nums[i]-nums[i-1]); //两数的差最小,其排序后一定相邻
}
cout<<min1<<endl;
return 0;
}