A. Maximize The Beautiful Value
戳我传送Solution
题目大意是把一个数往前挪至少k位,i到i-k数往后挪,因为这是个非递减数列,要求 最大 ,显然后面的权值大于前面,所以只要把一个数往前移动k位即可,之间的数往后挪动因此用前缀和加上sum[i - 1] - sum[i - 1 - k]即可
code
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define INF 1e8
const int mod = 1e9+7;
const int maxn = 1e5+7;
#define iss ios::sync_with_stdio(false)
inline int read() {
int s = 0, w = 1; char ch = getchar();
while (ch < 48 || ch > 57) { if (ch == '-') w = -1; ch = getchar(); }
while (ch >= 48 && ch <= 57) s = (s << 1) + (s << 3) + (ch ^ 48), ch = getchar();
return s * w;
}
ll a[maxn],sum[maxn];
int main() {
int T = read();
while (T--) {
int n = read(), k = read();
ll res = 0;
for (int i = 1; i <= n; ++i) {
a[i] = read();res += a[i] * i;
sum[i] = sum[i - 1] + a[i];
}
ll ans = 0;
for (int i = k + 1; i <= n; ++i) {
ans = max(ans,res + (sum[i - 1] - sum[i - 1 - k]) - a[i] * k);
}
printf("%lld\n", ans);
}
}
B. 身体训练
Solution
题目大意是n个人排成一列,间距为u,初始速度为v,最后面的人以 c [ i ]的速度跑到第一个人前u米,然后现在最后一个人再以c[ i ]跑,每过一轮每个人的最大速度衰减 d[ i ] 题目保证速度不会低于v,因此完全可以看成每个人开始是静止的即速度为c[ i ] - v,要跑的距离为 n * u,所得时间相加除 n 即可。code
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define INF 1e8
const int mod = 1e9+7;
const int maxn = 10005;
#define iss ios::sync_with_stdio(false)
inline ll read(){
ll s = 0, w = 1; char ch = getchar();
while (ch < 48 || ch > 57) { if (ch == '-') w = -1; ch = getchar(); }
while (ch >= 48 && ch <= 57) s = (s << 1) + (s << 3) + (ch ^ 48), ch = getchar();
return s * w;
}
int main(){
int n;
double u,v;
double c[1005],d[1005];
cin>>n>>v>>u;
for(int i = 0 ; i < n ;++i){
cin>>c[i];c[i] -= v;
}
for(int i = 0 ; i < n ;++i) cin>>d[i];
double t = 0,ans = 0,jj = 0;
for(int i = 0 ; i < n ;++i){
for(int j = 0 ; j < n ; ++j) t += u/c[j];
ans += t;t = 0;
for(int j = 0 ; j < n ; ++j) c[j]-=d[j];
}
cout<<fixed<<setprecision(3)<<ans<<endl;
}
E. 幸运数字Ⅱ
戳我传送Solution
用dfs模拟出所有的4 7 序即可code
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define INF 1e8
const int mod = 1e9+7;
const int maxn = 10005;
#define iss ios::sync_with_stdio(false)
inline ll read(){
ll s = 0, w = 1; char ch = getchar();
while (ch < 48 || ch > 57) { if (ch == '-') w = -1; ch = getchar(); }
while (ch >= 48 && ch <= 57) s = (s << 1) + (s << 3) + (ch ^ 48), ch = getchar();
return s * w;
}
vector<ll> q;
void dfs(ll x){
if(x>1e9) return ;
q.push_back((x<<3)+(x<<1)+4);//左移三为x*8,左移1为x*2,和就是x*10,听说这样更快(LS大佬教的)
dfs((x<<3)+(x<<1)+4);
dfs( (x<<3)+(x<<1)+7);
q.push_back( (x<<3)+(x<<1)+7);
}
int main(){
dfs(0);
sort(q.begin(),q.end());
q.push_back(4444444444);//注意范围
ll l,r;
cin>>l>>r;
ll pos = 0,ans = 0;
while(l<=r){
if(q[pos]>=l&&q[pos]<=r){
ans += (q[pos]-l+1)*q[pos];
l = q[pos]+1;
}
if(q[pos]>r){
ans += q[pos]*(r-l+1);
break;
}
++pos;
}
cout<<ans<<endl;
}

京公网安备 11010502036488号