第二场终于等来学弟 开始(被队友带飞)的开心(被虐)多校之旅
A run
A题是一个递推(dp?)+前缀和 因为看数据量比较大 就直接上前缀和了
一个比较简单的递推 没有太多难点 签到题 需要注意的一个点是在最后求前缀和相减取模的过程中先加上一个MOD 防止相减变成负数
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int N=1e5+10; const int MOD=1e9+7; int dp[N][2]; int l[N],r[N],sum[N]; int main(){ int q,k; scanf("%d%d",&q,&k); memset(dp,0,sizeof(dp)); memset(sum,0,sizeof(sum)); int maxn=0; for(int i=1;i<=q;i++){ scanf("%d%d",&l[i],&r[i]); maxn=max(maxn,r[i]); } for(int i=0;i<=k-1;i++){ dp[i][0]=1; dp[i][1]=0; } for(int i=k;i<=maxn;i++){ dp[i][0]=(dp[i-1][0]+dp[i-1][1])%MOD; dp[i][1]=dp[i-k][0]; } for(int i=1;i<=maxn;i++){ sum[i]+=(sum[i-1]+dp[i][0]+dp[i][1])%MOD; } for(int i=1;i<=q;i++){ printf("%d ",(sum[r[i]]-sum[l[i]-1]+MOD)%MOD); } return 0; }
D money
比赛中是队友写的 没有研究很多 赛后自己补题的时候用了模拟的思想 还有说可以用dp的 这里也没有想了
模拟的话 用tmp表示买进的价格 从a[0]开始与后一个比较 如果a[i]小于tmp 则表明可以用更低的价格去购买 同时用flag=0标记表明这一个是可以买的商品
如果a[i]大于tmp 则表明这是可以卖出的价格 假设在这一个点卖出 用flag=1标记在这里可以卖出 tmp更新为a[i] 用于检查之后是否有连续价格更高的可以卖的商品 如果之前已经有标记flag为1 表示前面的cnt已经有过更新 这里就不用再更新了
具体代码如下
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; typedef long long ll; const int maxn=1e5+10; int a[maxn]; int main(){ int t,n; scanf("%d",&t); while(t--){ scanf("%d",&n); for(int i=0;i<n;i++){ scanf("%d",&a[i]); } ll sum=0,cnt=0,tmp=a[0]; int flag=0; for(int i=1;i<n;i++){ if(tmp>a[i]){ tmp=a[i]; flag=0; } if(tmp<a[i]){ sum+=(a[i]-tmp); cnt+=2; tmp=a[i]; if(flag==1) cnt-=2; flag=1; } } printf("%lld %lld ",sum,cnt); } return 0; }
剩余题目先留坑 补完题再来