目录
一、初赛错题接解析
第一题
十进制转二进制较为麻烦,考虑验证每个选项
A选项:
B选项:
C选项:
D选项:
故选D
第二题
上一篇总结已经介绍了,这次还错,实在不应该…… ε=(´ο`*)))唉
答案是向上取整为
,故选
二、复赛模拟题
Problem 暴露的问题
时间紧张,T2没来得及跑样例,直接爆0。
Solution 解决方案
抓紧时间,不能摆烂,做好题目一定要跑样例!
第一题
题目
35分代码 纯模拟
#include<iostream>
using namespace std;
int n,l,r;
int a[100005];
long long t[100005];
int main() {
//freopen("times.in","r",stdin);
//freopen("times.out","w",stdout);
cin>>n>>l>>r;
for(int i=1;i<=n;i++){
cin>>a[i];
}
long long ans=0;
long long maxn_ans=0;
int k=0;
for(int i=1;i<=n;i++){
ans=0;
for(int j=max(i-l,1);j<=i;j++)
ans+=a[j];
long long x=0;
for(int j=i;j<=min(n,i+r);j++)
x+=a[j];
ans*=x;
maxn_ans=max(maxn_ans,ans);
t[i]=ans;
}
for(int i=1;i<=n;i++){
if(t[i]==maxn_ans)
cout<<i<<" ";
}
}
题解
观察题意可以发现,题目要求的和可以简单地使用前缀和优化。记表示前缀和数组,那么
中的数字便是
。
注意
,使用前缀和对于任何
在
的时间统计出答案。
时间复杂度
标程
#include<iostream>
using namespace std;
using LL=long long;
const int maxN=1e5+5;
int n,L,R;
int a[maxN];
LL sum[maxN];
LL Sum(int l,int r){
return sum[r]-sum[l-1];
}
LL calc(int i){
int l=max(i-L,1);
int r=min(i+R,n);
return Sum(l,i)*Sum(i,r);
}
int main(){
cin>>n>>L>>R;
LL ans=0;
for(int i=1;i<=n;i++)
cin>>a[i],sum[i]=sum[i-1]+a[i];
for(int i=1;i<=n;i++)
ans=max(ans,calc(i));
for(int i=1;i<=n;i++)
if(calc(i)==ans)
cout<<i<<' ';
cout<<endl;
}
第二题
题目
60分代码 暴力
#include<iostream>
using namespace std;
long long first(long long n) {//取第一位
while (n >= 10) n /= 10;
return n;
}
bool check(long long x, long long y) {//检查是否满足要求
long long x_last = x % 10;
long long y_last = y % 10;
long long x_first = first(x);
long long y_first = first(y);
if (x_last == y_first && x_first == y_last) return true;
return false;
}
int main() {
//freopen("number.in", "r", stdin);
//freopen("number.out", "w", stdout);
long long n;
cin >> n;
long long ans = 0;
for (long long i = 1; i <= n; i++) {
for (long long j = i; j <= n; j++) {
if (check(i, j))
if(i == j) ans ++; else ans+=2;//如果i,j相等有1种,不相等有2种
}
}
cout << ans;
}
题解
设表示首位是
,末尾是
的数字的个数,那么符合条件的数字必然一个被
统计入,一个被
统计进入。
所以只需要将中的所有数字统计进入
这个二维数组,然后枚举
计算答案即可。
标程
#include<iostream>
using namespace std;
using LL=long long;
const int maxN=1e6+5;
int f[10][10];
void sta(int i){
string str=to_string(i);
++f[str[0]-'0'][str.back()-'0'];
}
LL calc(int n){
for(int i=0;i<10;i++)
for(int j=0;j<10;j++)
f[i][j]=0;
for(int i=1;i<=n;i++){
sta(i);
}
LL res=0;
for(int i=0;i<10;i++)
for(int j=0;j<10;j++)
res+=(LL)f[i][j]*f[j][i];
return res;
}
int main(){
int n;
cin>>n;
cout<<calc(n);
}