比赛链接
给你两个数组 分别为A,B
现在组合成C数组,ci的值为Ai*Bj最大值为0<i<=j<=n
分析:预处理每个j对应的最大值A[i],并且保存C[i-1]的值,
c[i]的值等于c[i-1],b[i]*sum[i];
AC代码:
#include<bits/stdc .h> #define ll long long using namespace std; const int mod=1e9 7; const int N=2e5 10; ll a[N]; ll b[N]; ll max1[N]; int main() { int n; cin>>n; for(int i=1; i<=n; i ) { cin>>a[i]; if(max1[i-1]>a[i]) { max1[i]=max1[i-1]; } else { max1[i]=a[i]; } } for(int i=1; i<=n; i ) { cin>>b[i]; } ll ans=0; for(int i=1; i<=n; i ) { ll k=max(ans,b[i]*max1[i]); ans=k; cout<<k<<endl; } return 0; }
题意:有N个数字,K每个盒子中不存在的最小非负数是次盒的值,所以盒子的最大值
分析:用桶存储数字的数量,从前到后进行枚举和添加。详见代码
#include<bits/stdc .h> #define ll long long using namespace std; const int mod=1e9 7; const int N=4e5 10; int a[N]; int main() { int n,k; cin>>n>>k; for(int i=0; i<n; i ) { int q; cin>>q; a[q] ; } int sum=0; for(int i=0; i<n; i ) { if(a[i]) { if(a[i]<k) { sum =i*(k-a[i]); k=a[i]; } } else { sum =i*(k-a[i]); k=a[i]; break; } } cout<<sum<<endl; return 0; }
C
题意 一个H*W字母写在矩阵中的K格子上R,D,X
R只能移动至(i,j 1)格子中,D只能移动至(i 1,j)的格子中,x则都可以
空白格子可以写任何字母,问(H,W)有多少种路径。
分析:偷懒,下次写~~~
#include<bits/stdc .h> #define ll long long using namespace std; const int mod=998244353; const int N=5010; char mp[N][N]; ll dp[N][N]; long long int pows(long long int a, long long int k) { long long int ans = 1; a %= mod; while(k) { if(k % 2) ans *= a; a = (a * a) % mod; k /= 2; ans %= mod; } return ans; } int main() { ll h,w,k; cin>>h>>w>>k; ll t=k; while(t--) { int x,y; char c; cin>>x>>y>>c; mp[x][y]=c; } ll ans=pows(3,h*w-k); dp[1][1]=ans; ans=pows(3,mod-2); for(int i=1; i<=h; i ) { for(int j=1; j<=w; j ) { if(mp[i][j]=='R') { dp[i][j 1]=(dp[i][j 1] dp[i][j])%mod; } else if(mp[i][j]=='D') { dp[i 1][j]=(dp[i 1][j] dp[i][j])%mod; } else if(mp[i][j]=='X') { dp[i][j 1]=(dp[i][j 1] dp[i][j])%mod; dp[i 1][j]=(dp[i 1][j] dp[i][j])%mod; } else { dp[i][j 1]=(dp[i][j 1] dp[i][j]*ans%mod)%mod; dp[i][j 1]=(dp[i][j 1] dp[i][j]*ans%mod)%mod; dp[i 1][j]=(dp[i 1][j] dp[i][j]*ans%mod)%mod; dp[i 1][j]=(dp[i 1][j] dp[i][j]*ans%mod)%mod; } } } cout<<dp[h][w]<<endl; return 0; }