第一题
其实是一道数学题
cpp
#include <stdio.h>
#include <math.h> // 包含 sqrt()、arctan2() 函数
int main() {
// 目标点坐标
int target_x = 233;
int target_y = 666;
// 1. 计算水平移动距离(即目标点到原点的半径 r)
double r = sqrt(target_x * target_x + target_y * target_y);
// 2. 计算圆心角 θ(弧度制,arctan2(y, x) 直接返回正确角度)
double theta = atan2(target_y, target_x); // 范围 (-π, π],此处为正角
// 3. 计算圆周最短弧长(r * θ,θ已为最短夹角)
double arc_length = r * theta;
// 4. 计算总移动距离(水平距离 + 弧长)
double total_distance = r + arc_length;
// 输出结果(保留2位小数,提高可读性)
int a=(int)total_distance;
printf("%d\n",a);
return 0;
}
第三题
找规律,我们可以发现除了1,其余都可以用三个及以上连续的整数表示(因为有正有负可以抵消啊)
但是只有1没法用三个连续的整数表示
cpp
#include<iostream>
using namespace std;
const int N=100010;
typedef long long ll;
int n;
ll a[N];
int main()
{
cin>>n;
int res=0;
for(int i=1;i<=n;i++)
{
cin>>a[i];
if(a[i]!=1)res++;
}
cout<<res<<endl;
return 0;
}
第四题
这个题目很简单,其实就是不断对产值按要求进行调整--》但是容易错的一点就是容易超时--》要想办法优化一下,那就还是找规律--》我们发现在这三个调整公式当中如果a,b,c产值相等了那么就没必要调整了在调整也是那些--》可以提前结束(我为什么做的时候发现不了哇😟)
cpp
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
int t;
int main()
{
cin>>t;
while(t--)
{
ll a,b,c,k;
cin>>a>>b>>c>>k;
while(k--)
{
ll a1=a,b1=b,c1=c;
a=(b1+c1)/2;
b=(a1+c1)/2;
c=(a1+b1)/2;
if(a==b&&b==c)break;
}
cout<<a<<' '<<b<<' '<<c<<endl;
}
return 0;
}
第五题
我一开始一看这个题目--》那不就是dfs暴力枚举吗(组合型枚举)于是喜提tle
那么就先分析一下暴力是怎样暴力的吧
我看他是在n副画中挑出m副进行展览--》直接就是组合型枚举(枚举每个位置放哪个)--》再看他想要使l最小--》那在dfs枚举中加一个变量sum表示他不就完了(那就开干!!)
cpp
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=100010;
int n,m;
int a[N];
bool st[N];
int b[N];
long long res=1e18;
void dfs(int x,int last,long long sum)
{
if(x==m)
{
res=min(res,sum);
return;
}
if(x>m)return;
for(int i=0;i<n;i++)
{
if(!st[i])
{
st[i]=true;
dfs(x+1,i,sum+abs(a[i]*a[i]-a[last]*a[last]));
st[i]=false;
}
}
}
int main()
{
cin>>n>>m;
for(int i=0;i<n;i++)
{
cin>>a[i];
}
for(int i=0;i<n;i++)
{
st[i]=true;
dfs(1,i,0);
st[i]=false;
}
cout<<res<<endl;
return 0;
}
再仔细分析一下这个题目--》求的是
的最小值
那么肯定是相差越远这个值就越大,所以最小值肯定出现在一个连续的区间中(而且区间的大小为m)--》所以我们考虑先排个序,然后在计算--》那么因为计算的是一段区间的平方差的和--》自然而然想到前缀和去优化--》滑动大小为m的窗口找到最小值
cpp
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
const int N=100010;
int n,m;
int a[N];
ll pre[N];
long long sum=1e18;
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
sort(a+1,a+n+1);
for(int i=2;i<=n;i++)//注意从2开始
{
pre[i]=pre[i-1]+abs(a[i]*a[i]-a[i-1]*a[i-1]);
}
for(int i=1;i+m-1<=n;i++)
{
sum=min(sum,pre[i+m-1]-pre[i]);//注意使pre[i]不是pre[i-1]
}
cout<<sum<<endl;
return 0;
}
第六题
动态规划--》但是实在想不出来怎么写(讨厌的动态规划)暴力也没写出来🤯
把一列看成一种状态(暂时学不会)
第八题
这个题目仔细一看,其实就是枚举这三个符号的全排列然后加上运算符--》其实就是dfs枚举+表达式求值(用栈解决)--》但是这样暴力只能拿一半的分(嘻嘻🤭已经很好了)
cpp
#include<iostream>
#include<algorithm>
#include<cstring>
#include<stack>
using namespace std;
const int N=100010,mod=1e9+7;
typedef long long ll;
int n;
int a[N];
int s[N];
ll ans=0;
void dfs(int u)
{
if(u>=n)
{
stack<int> stk,stk2;
stk.push(a[1]);
for(int i=1;i<=u;i++)
{
if(s[i]==1||s[i]==2)
{
stk.push(a[i+1]);
stk2.push(s[i]);
}
else
{
int t1=stk.top();
stk.pop();
stk.push(t1^a[i+1]);
}
}
while(!stk2.empty())
{
int t=stk2.top();
stk2.pop();
int t1=stk.top();stk.pop();
int t2=stk.top();stk.pop();
if(t==1)stk.push(t1+t2);
else stk.push(t2-t1);
}
ans=(ans+stk.top())%mod;
return;
}
s[u]=1;
dfs(u+1);
s[u]=2;
dfs(u+1);
s[u]=3;
dfs(u+1);
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++)cin>>a[i];
dfs(1);
cout<<ans<<endl;
return 0;
}