题目链接:
file:///C:/Users/Administrator/Desktop/%E4%B8%8B%E5%8F%91%E6%96%87%E4%BB%B61005/20241005.pdf
T1:
题目分析:不需要进行模拟,想要获得分数最大化,只需要将大的数据相加,再减去小的数据。
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e5+5;
int a[N], n,sum1,sum2,k;
signed main() {
freopen("problem.in","r",stdin);
freopen("problem.out","w",stdout);
cin>>n;//n个数
for(int i=1; i<=n; i++)cin>>a[i];//读入这n个数
sort(a+1,a+n+1);//排序,小的靠左,大的靠右
(n%2==0)?(k=n/2):(k=(n-1)/2);//判断一下n是否是单数,好确定加上的和减去的数的个数
for(int i=1;i<=k;i++)sum1+=a[i];//sum1是小的数相加的和
for(int i=k+1;i<=n;i++)sum2+=a[i];//sum2是大的数相加的合
int sum3=sum2-sum1;//按照题目要求相减
cout<<sum3;
return 0;
}
T2
题目分析:(题目内容和标题完全没关系)
最大公因数就是那几个因子相乘的乘积,最小公倍数一样。
#include<bits/stdc++.h>
using namespace std;
const int MOS=1e9+7,N=1e6+5;
int n,m,v,maxn,t[N];
long long cnt=1;
int main() {
freopen("gcm.in","r",stdin);
freopen("gcm.out","w",stdout);
cin>>n;
for(int i=1;i<=n;i++){
cin>>v;
t[v]--;//因为最小公倍数一定包含最大公因数,所以先将最大公因数的因子减去,再把最小公倍数的因子加上,数组里面被标记的就是有这个因子的。
}
cin>>m;
for(int i=1;i<=m;i++){
cin>>v;
t[v]++;
maxn=max(maxn,v);//最大的因子一定包含在最小公倍数的因子里
}
for(int i=1;i<=maxn;i++){
if(t[i]>0){//如果有这个因子的就把它×2
cnt=(cnt*2)%MOS;//随时取余
}
}
cout<<cnt;
return 0;
}
T3:原本想法是DFS,考试的时候全WA了。后面AC的解法是用DP,
dp[i][j][0/1]记录是从上面还是左面来的。
#include<bits/stdc++.h>
using namespace std;
const int N=1005;
int a[N][N],dp[N][N][2],n,m;
long long read() {
int x=0,f=1;
char c=getchar();
while(c<'0'||c>'9') {
if(c=='-') f=-1;
c=getchar();
}
while(c>='0'&&c<='9') {
x=x*10+c-'0';
c=getchar();
}
return x*f;
}
int main() {
freopen("energy.in","r",stdin);
freopen("energy.out","w",stdout);
n=read();
m=read();
for(int i=1; i<=n; i++)
for(int j=1; j<=m; j++)
a[i][j]=read();
dp[1][0][0]=dp[1][0][1]=dp[0][1][0]=dp[0][1][1]=a[1][1];
for(int i=1; i<=n; i++)
for(int j=1; j<=m; j++) {
dp[i][j][0]=max((dp[i][j-1][0]+a[i-1][j]),dp[i][j-1][1])+a[i+1][j]+a[i][j+1];
dp[i][j][1]=max(dp[i-1][j][0],(dp[i-1][j][1]+a[i][j-1]))+a[i][j+1]+a[i+1][j];
}
cout<<dp[n][m][0];//严格来说要取一个max,但是不取能AC,如果是dp[n][m][1]只能拿50分+
return 0;
}
T4:
打表打错了【哭死】
#include<bits/stdc++.h>
using namespace std;
int x,vis[1000001],a=1,b=1;
long long read() {//用个快读优化一点
int x=0,f=1;
char c=getchar();
while(c<'0'||c>'9') {
if(c=='-') f=-1;
c=getchar();
}
while(c>='0'&&c<='9') {
x=x*10+c-'0';
c=getchar();
}
return x*f;
}
int main() {
freopen("fibonacci.in","r",stdin);
freopen("fibonacci.out","w",stdout);
x=read();
vis[1]=1;
for(int i=1;i<=1e7; i++) {//数据不大,1e7直接算斐波那契数列
int c=a+b;
c%=x;
a=b;
b=c;
vis[b]=1;
if(a%x==0&&b%x==0) break;//如果这个斐波那契数列的数是x的倍数,就说明x的倍数会是斐波那契书
}
int ans=0;
for(int i=1;i<x;i++) {//
if(!vis[i%x])ans++;
}
printf("%d",ans);
return 0;
}
总结:
本次考试T1 没扣分,后面的T4没想到思路,T2和正解思路有点偏差。