第一题
这个题目经典的数学题
先算所有人都握手且不重复---》第一个人和n-1人,第二个和n-2个人,···,第n个和0个人--》也就是求n-1+n-2+...+1,一个循环就得出来了--》在计算7个人互相握手次数--》6+5+4+3+2+1--》然后用所有人减去七个人就行
cpp
#include<iostream>
using namespace std;
const int N=100010;
int main()
{
int sum=0;
for(int i=49;i>0;i--)
{
sum+=i;
}
int cnt=0;
for(int i=6;i>0;i--)
{
cnt+=i;
}
cout<<sum-cnt<<endl;
return 0;
}
第三题
一个个枚举然后判断(这个没有什么技术含量)--》把每个数拆成一位一位的放进数组,然后遍历进行判断
cpp
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=10000010;
int n;
int a[N];
int k=0;
bool check(int x)
{
k=0;
while(x)
{
a[k++]=x%10;
x/=10;
}
for(int i=0;i<k;i++)
{
if(i%2==0)
{
if(a[i]%2==0)return false;
}
else
{
if(a[i]%2!=0)return false;
}
}
return true;
}
int main()
{
cin>>n;
int cnt=0;
for(int i=1;i<=n;i++)
{
if(check(i))
{
cnt++;
}
}
cout<<cnt<<endl;
return 0;
}
第四题(不满分版)
这个要用高精度(学了全忘了,而且太麻烦了,我就用了round函数拿了一点点分♥)
cpp
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
int n;
double d;
int main()
{
cin>>n>>d;
for(int i=1;i<=n;i++)
{
d=d*2;
}
cout<<round(d)<<endl;
return 0;
}
第五题(不满分暴力版)
依旧是暴力dfs枚举(从n个里面找3个)--》组合枚举(超时tle又和你见面了)
看他这个公式,牵扯到最小公倍数和最大公因数的化简以及求解

看见公式先化简一下吧

cpp
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
const int N=100010;
ll ans=-1;
int n;
int a[N];
int path[4];
int best[4];
bool st[N];
int gcd(int a,int b)
{
while(a%b!=0)
{
int c=a%b;
a=b;
b=c;
}
return b;
}
ll value()
{
int x=gcd(path[1],path[2]);
int y=gcd(x,path[3]);
return y;
}
void dfs(int x,int start)
{
if(x==4)
{
ll sum=value();
if(sum>ans)
{
ans=sum;
for(int i=1;i<=3;i++)
{
best[i]=path[i];
}
}
else if(sum==ans)
{
bool flag=false;
if(path[1]<best[1])flag=true;
else if(path[1]==best[1]&&path[2]<best[2])flag=true;
else if(path[1]==best[1]&&path[2]==best[2]&&path[3]<best[3])flag=true;
if(flag)
{
for(int i=1;i<=3;i++)
{
best[i]=path[i];
}
}
}
return;
}
if(x>4)return;
for(int i=start;i<=n;i++)
{
if(!st[i])
{
st[i]=true;
path[x]=a[i];
dfs(x+1,i+1);
st[i]=false;
}
}
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++)cin>>a[i];
sort(a+1,a+n+1);
dfs(1,1);
for(int i=1;i<=3;i++)
{
cout<<best[i]<<' ';
}
return 0;
}
第八题(看不懂题目版)
其实是不想看题,这个题目让人心烦
第七题
其实就是找两个连续的队伍而且不重合--》使得力量和之差最小--》现在看来的话要求一段连续的之和,也就是用前缀和嘛🤭(每个队伍的人数不是确定的是随机的)所以我们要先计算出长度不同连续区间的和,然后进行排序--》找到力量和差最小而且不重叠的两个连续队伍
cpp
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
const int N=1010;
int n;
ll a[N];
struct node{
int l,r;
ll sum;
}b[N*N/2];
bool cmp(node a,node b)
{
return a.sum<b.sum;
}
ll total[N];
int main()
{
cin>>n;
int cnt=0;
for(int i=1;i<=n;i++)
{
cin>>a[i];
total[i]=total[i-1]+a[i];
}
for(int l=1;l<=n;l++)
{
for(int r=l;r<=n;r++)
{
b[cnt].l=l;
b[cnt].r=r;
b[cnt].sum=total[r]-total[l-1];
cnt++;
}
}
sort(b,b+cnt,cmp);
ll ans=1e18;
for(int i=0;i<cnt;i++)
{
if(b[i].r<b[i+1].l||b[i+1].r<b[i].l)
{
ans=min(ans,abs(b[i+1].sum-b[i].sum));
}
}
cout<<ans<<endl;
return 0;
}