• 牛客练习赛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

    咕咕咕

  • 相关阅读:
    C# 给Word每一页设置不同图片水印 E
    C#/VB.NET 将XML转为PDF E
    Java 替换PDF中的字体 E
    C# 读取txt文件生成Word文档 E
    AVL Tree
    Kafdrop
    Python递归遍历目录并删除文件中的前N行
    canal
    中医考研必背针灸歌诀
    nginx(https)代理问题
  • 原文地址:https://www.cnblogs.com/ZUTTER/p/10223498.html
Copyright © 2020-2023  润新知