2026第四次萌新赛
2026/8/14 15:44:37 网站建设 项目流程

2026第四次萌新赛

签到:M , G easy:L , J mid:D , H , I mid - hard:C , B , E , F hard:K , A

M题:噢耶,奶奶的龙!!!

刚开始算极限值,把最后一个sin(1/x)1/x替换掉了,忘记等价无穷小的前提是1/x要趋近于0,而现在是趋近于无穷,而现在sin(1/x)是有界,x是等价无穷小;等价无穷小乘有界结果是0,直接输出0即可。

#include<bits/stdc++.h> using namespace std; #define int long long signed main(){ int ans=0; cout<<ans; return 0; }

G题 :你逃不过我你信不信

这个刚开始想的是循环相乘,中间对10000取余,但是这样到后面的时候就是超时,然后通过一个个试样例发现,到后面输出的只是一样的,都是0313,然后就分情况输出。

#include<bits/stdc++.h> using namespace std; #define int long long signed main(){ int n; cin>>n; int ans=1; int sum=0; if(n>10000000){ cout<<"0313"; } else{ for(int i=1;i<=n;i++){ ans=ans*i; ans=ans%10000; sum=sum+ans; sum=sum%10000; } if(sum<10){ cout<<"000"<<sum; } else if(sum<100){ cout<<"00"<<sum; } else if(sum<1000){ cout<<0<<sum; } else{ cout<<sum; } } return 0; }

L题:A × B

这道题是大数乘法,数字过大普通整型存不下,用字符串存储数字,模拟竖式乘法。将两个字符串反转,让个位放在下标 0,方便位权计算。开大小为两数位数之和的数组,双重循环逐位相乘,乘积加到res[i+j]。遍历数组统一处理进位。倒序读取数组拼接答案,去掉前导零。

#include<bits/stdc++.h> using namespace std; #define int long long signed main(){ string a,b; cin>>a>>b; reverse(a.begin(),a.end()); reverse(b.begin(),b.end()); vector<int>res(a.size()+b.size()); for(int i=0;i<a.size();i++){ for(int j=0;j<b.size();j++){ int a1=a[i]-'0'; int b1=b[j]-'0'; res[i+j]=res[i+j]+a1*b1; } } int c=0; for(int i=0;i<res.size();i++){ int sum=res[i]+c; res[i]=sum%10; c=sum/10; } string ans; bool ok=true; for(int i=res.size()-1;i>=0;i--){ if(res[i]==0&&ok){ continue; } ok=false; ans.push_back(res[i]+'0'); } cout<<ans; return 0; }

J题:小苯的星轨

区分原点和普通点,用 z 记录原点数量。原点最多有一个,最后答案再加上n-1; 对每个非原点,建立gcd函数,找到最大公约数,把坐标向量约分,并统一正负方向,把把下面的翻到上面,水平直线的都翻到正半轴,保证同一直线上的向量形式一致。用map 统计每条直线上的点数,用组合公式c*(c-1)/2,表示c里面有两个不同的点可以组成星对,计算同直线非原点组成的点对。

#include<bits/stdc++.h> using namespace std; #define int long long #define PII pair<int,int> int gcd(int a,int b){ while(b>0){ int t=a%b; a=b; b=t; } return a; } void solve(){ int n; cin>>n; int z=0; int ans=0; map<PII,int>mp; int x,y; for(int i=0;i<n;i++){ cin>>x>>y; if(x==0&&y==0){ z++; continue; } int g=gcd(abs(x),abs(y)); x=x/g,y=y/g; if(y<0||y==0&&x<0){ x=-x; y=-y; } mp[{x,y}]++; } for(auto &it:mp){ PII p=it.first; int cut=it.second; ans=ans+cut*(cut-1)/2; } if(z>0){ ans=ans+(n-1); } cout<<ans; cout<<endl; } signed main(){ int t; cin>>t; while(t--){ solve(); } return 0; }

D题:小圆爱玩龙龙(Easy)

允许在选出的道具里至多免费拿走一件,免费道具不占用预算,其余道具总花费不能超过给定预算w1,目标求最大快乐值。依次假设每一件道具 f 作为免费获取的道具,直接获得它的快乐值(v[f])。对于除 f 之外的所有道具,执行 01 背包。dp[j]代表预算最多花费j元时,购买付费道具能得到的最大快乐值。付费道具在预算 w1 内的最优结果为(dp[w1]),加上免费道具快乐值(v[f]),更新全局最优答案。枚举完所有可免费的物品后,输出最大快乐值。

#include<bits/stdc++.h> using namespace std; int main(){ int n,w1; cin>>n>>w1; vector<int>w(n+1),v(n+1); for(int i=0;i<n;i++){ cin>>w[i]>>v[i]; } int ans=0; for(int f=0;f<n;f++){ vector<int>dp(w1+1); for(int i=0;i<n;i++){ if(i==f){ continue; } for(int j=w1;j>=w[i];j--){ dp[j]=max(dp[j],dp[j-w[i]]+v[i]); } } ans=max(ans,dp[w1]+v[f]); } cout<<ans; }

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询