打完十场回顾一下之前一些的题 都是简单题 难的我不会
继续努力
Luxury cruise ship
纯签到 完全背包。数据有点大。三个物品价值是互质的,我们把7,31,365乘起来,用n%(7*31*365),计算dp[n]+n/(7*31*365)*31*365即可
#include <bits/stdc++.h> #define int long long using namespace std; const int N = 365 * 31 * 7+1; int dp[N], w[4] = { 0,7,31,365 }; int n; signed main() { ios::sync_with_stdio(false); fill(dp, dp + 365 * 31 * 7+1, 0x3f3f3f3f); dp[0] = 0; for (int i = 1; i <= 3; i++) { for (int j = w[i]; j <= N; j++) dp[j] = min(dp[j], dp[j - w[i]] + 1); } int t; cin >> t; while (t--) { cin >> n; int t = n % (365 * 31 * 7); if (dp[t] == 0x3f3f3f3f) cout << -1 << endl; else cout << dp[t] + n / (365 * 31 * 7) * 31 * 7 << endl; } }
Package Delivery
易知 贪心 堆优化
小于等于k个,那我们直接全部取出即可。大于k个,那么我们取出最紧急的k个。
#include<bits/stdc++.h> using namespace std; const int N=400010; typedef pair<int,int> PII; int l[N],r[N]; struct node{ int l,r; }p[N]; bool cmp(node a,node b) { return a.l<b.l; } void solve() { int n,k; scanf("%d%d",&n,&k); for(int i=1;i<=n;i++) scanf("%d%d",&p[i].l,&p[i].r); sort(p+1,p+n+1,cmp); priority_queue<PII,vector<PII>,greater<PII> >q; while(!q.empty()) q.pop(); q.push({p[1].r,p[1].l}); int t=p[1].r,ans=0; for(int i=2;i<=n;) { while(i<=n&&(p[i].l<=t||t==-1)) { if(t==-1) t=p[i].r; t=min(t,p[i].r); q.push({p[i].r,p[i].l}); i++; } if(!q.empty()) { ans++; if(q.size()<=k){ while(!q.empty()) q.pop(); t=-1; } else{ int tt=k; while(tt--) q.pop(); t=q.top().first; } } } ans+=(q.size()+k-1)/k; printf("%d\n",ans); } signed main() { int _; cin>>_; while(_--) { solve(); } }
Climb Stairs
这个题数据其实比较水(非常水) 官方题解是线段树 其实以这个题的数据之弱 直接暴力枚举加一个前缀和判断来剪枝就能过 全场都过直接做成签到题~
容易看出贪心做法 就是往回跳的过程的判断 不能暴力枚举 线段树来维护优化能做(O(nlogn)) 用dp的思想也能维护出 而且更快(O(n)) 暴力加简单的剪枝也能过.......
随便搞的暴力+剪枝code(再吐槽一下数据真的拉):
#include<bits/stdc++.h> #define int long long using namespace std; int read(int &n){ char ch=' '; int q=0,w=1; for(;(ch!='-')&&((ch<'0')||(ch>'9'));ch=getchar()); if(ch=='-')w=-1,ch=getchar(); for(;ch>='0'&&ch<='9';ch=getchar())q=q*10+ch-48; n=q*w; return n; } const int N=1e5+10; int n,k,a[N]; int f[N]; void sovle() { read(n); read(a[0]); read(k); f[0]=a[0]; for(int i=1;i<=n;i++){ read(a[i]); f[i]=f[i-1]+a[i]; } int F=1; int sum=a[0]; for(int i=1;i<=n;i++){ if(sum>=a[i]){ sum+=a[i]; } else{ int F2=0; int len1=-1; if(k>=n-i+1){ k=n-i+1; } for(int j=2;j<=k;j++){ int cnt=sum; if(cnt+f[i+j-1]-f[i] < a[i]){ continue; } F2=1; len1=j; for(int k0=i+j-1;k0>=i;k0--){ if(cnt>=a[k0]){ cnt+=a[k0]; } else{ F2=0; break; } } if(F2)break; } if(F2){ sum += f[i+len1-1]-f[i-1]; i += len1-1; } else{ F=0; break; } } } if(F)cout<<"YES"<<endl; else cout<<"NO"<<endl; } signed main(){ int t; read(t); while(t--){ sovle(); } }
(努力更新中 这几天能写的会全部补完)
除了一些不想补的 和对我来说太难的
标签:杭电多校,ch,10,int,31,long,补题,365,dp From: https://www.cnblogs.com/0521pan/p/16507949.html