牛客練習賽36
阿新 • • 發佈:2019-01-05
Rabbit的字串
就是最小表示法啊
#include<iostream> #include<cstdio> #include<cstring> #define M 2010000 using namespace std; int k,m,n,b,l,r; char c[M],d[M]; int Min(char *s, int n){ int i=0,j=1,k; while(i<n&&j<n){ k=0; while(s[(i+k)%n]==s[(j+k)%n]&&k<n) k++; if(k==n) return i; if(s[i+k]>s[j+k])i+=k+1; else j+=k+1; if(i==j)j++; } return min(i,j); } int main() { scanf("%d",&n); for(int i=0;i<n;i++) cin>>c[i]; if(Min(c,n)!=0) printf("YES"); else printf("NO"); }
Rabbit的工作(1)
dp
\(f[i][j]\)表示前\(i\)天工作\(j\)天最小體力消耗
每次從後往前列舉最後一段工作時間
沒了
#include<iostream> #include<cstdio> #include<cstring> using namespace std; int n,m,k,f[401][401],a[401],d[410],ans; int main() { scanf("%d%d",&n,&k); for(int i=1;i<=n;i++) d[i]=d[i-1]+i; memset(f,0x3f,sizeof(f)); f[0][0]=0; for(int i=1;i<=n;i++) scanf("%1ld",&a[i]),f[i][0]=0; for(int i=1;a[i];i++) f[i][i]=d[i]; for(int i=1;i<=n;i++) { if(a[i]) for(int l=1;l<=i;l++) { for(int j=i;j>=2 && a[j]&& i-j+1<=l;j--) if(f[j-2][l-i+j-1]+d[i-j+1]<=k) f[i][l]=min(f[i][l],f[j-2][l-i+j-1]+d[i-j+1]); if(f[i][l]<=k) ans=max(ans,l); } for(int j=1;j<=i;j++) f[i][j]=min(f[i][j],f[i-1][j]); } printf("%d",ans); }
Rabbit的工作(2)
ZUTTER用優秀的\(O(n^3)\)加邊界優化把它卡過去了!!!!
這個故事告生動訴我們一個真理人有多大膽,地有多大產
正解
為了去掉所有任務的限制先給每個工作分一天,把\(V[2]-V[n]\)整體建\(V[1]\)
然後這不就是一個完全揹包了嘛!!!
\(O(n^2)\)解決
ZUTTER的心理動向
感覺只有\(O(n^3)\)做法啊
怕不是斜率優化\單調性優化\線段樹優化
可是我不會啊!!!
2≤ N,K≤ 2000,K≤ W≤ min(4000,2*K)
矮這個\(w\)範圍比\(n,k\)只大一倍有點奇怪啊
把\(n\)
經過一波冷靜分析似乎複雜度挺有前途的!!??
#include<iostream> #include<cstdio> #include<cstring> using namespace std; int i,m,n,j,k,a[2001],w,f[4001][2001]; int main() { scanf("%d%d%d",&n,&k,&w); for(int i=1;i<=n;i++) scanf("%d",&a[i]); memset(f,-0x3f,sizeof(f)); f[0][0]=0; for(int i=1;i<=n;i++) for(int j=0;j<=w-i;j++) for(int l=max(0,k-(w-j)/i);l<k;l++) f[j+i][l+1]=max(f[j+i][l+1],f[j][l]+a[i]); printf("%d",f[w][k]); }
然後就用暴力過了一道只有6個人過的題
Rabbit的數列
分塊啊
可是我不會啊
咕咕咕
Rabbit的機器人
甚至沒看題
咕咕咕
Rabbit的蛋糕
計算幾何
可是我也不會啊(我怎麼這麼菜啊QAQ
咕咕咕