目前博主还没获得真题,现将代码分享出来
博主能力有限,只获得了290分的成绩
第一题依照题意模拟就行
#include<bits/stdc++.h>
using namespace std;
int main(){
long long b,c,l,r,sum=0;
cin>>b>>c>>l>>r;
for(long long i=l;i<=r;i++){
if(i%2==0){
sum+=i*i+b*i+c;
}
}
cout<<2*sum;
return 0;
}
第二题(完全背包)
#include<bits/stdc++.h>
using namespace std;
long long dp[10005],m,a,n;
int main(){
cin>>n>>m;
for(int v=1;v<=m;v++)
{
cin>>a;
for(int i=v;i<=n;i++){
dp[i]=max(dp[i],dp[i-v]+a);
}
}
cout<<dp[n];
return 0;
}
第三题(字符串模拟,1,3操作比较好实现)
#include<bits/stdc++.h>
using namespace std;
map<string,long long>arr;
const long long num=1000000007;
int main(){
long long n,x,sum;
string a,b,temp;
cin>>n;
while(n){
cin>>x;
if(x==1){
cin>>a;
sum=0;
temp="";
getline(cin,b);
b=b+" ";
for(int i=1;i<b.length();i++){
if(b[i]==' '){
if(temp[0]=='$'){
temp.erase(0,1);
sum+=arr[temp];
}
else{
sum+=temp.length();
}
temp="";
}
else{
temp=temp+b[i];
}
}
arr[a]=sum%num;
}
else if(x==3){
cin>>a;
cout<<arr[a]%num<<endl;
}
n--;
}
return 0;
}
第四题(暴力拿了30分)
#include<bits/stdc++.h>
using namespace std;
const long long num=998244353;
long long n,arr[1000005],now,ans=0,flag=0;
int main(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>arr[i];
if(i==1) flag=arr[i];
else flag=__gcd(flag,arr[i]);
}
for(int i=1;i<=n;i++) arr[i]/=flag;
for(int i=1;i<=n;i++){
now=arr[i];
int j;
for(j=i;j<=n;j++){
now=__gcd(now,arr[j]);
ans+=i*j*now%num;
//cout<<i*j*now%num<<" ";
ans%=num;
if(now==1) break;
}
if(now==1&&j<n){
ans+=(n+j+1)*(n-j)/2*i%num;
}
ans%=num;
}
cout<<ans*flag%num;
return 0;
}
/*
5
10 2 6 6 8
20
7 6 5 5 17 18 13 3 11 12 7 9 16 15 5 19 20 13 14 6
*/
总结:
1.这次简单题很简单,难题很难。前两题13分钟都做了出来,在第四题上卡了差不多两个小时,在第一次提交时2,3数据点显示输出错误,以为数据不强没有超时,所以一直在调,后发现是取模操作有问题,交上去喜提超时。第三题1,3操作很简单,20分钟就拿了60分。
2.第四题好像要用线段树+二分,第四题貌似是树形dp,这些博主都不会。