AFO

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

咕咕咕

posted @ 2019-01-05 10:10  ZUTTER☮  阅读(164)  评论(0编辑  收藏  举报