1. 程式人生 > >牛客練習賽36

牛客練習賽36

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\)

    提到最外層再列舉\(w\)再列舉\(k\)感覺會快很多啊

    經過一波冷靜分析似乎複雜度挺有前途的!!??

    #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

咕咕咕