牛客小白月赛19

A

「水」滔天巨浪

#include<bits/stdc++.h> 
using namespace std;
int n;
int a[10004],b[100004];
int main()
{
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
	{
		scanf("%d",&a[i]);
	}
	int ans=0;
	int hh=0;
	a[0]=0;
	a[n+1]=1001;
	for(int i=1;i<=n;i++)
	{
		if(a[i-1]+1==a[i]&&a[i]+1==a[i+1]) ans++;
		else ans=0;	
		hh=max(hh,ans);
	}
	printf("%d\n",hh);
}
B 「木」迷雾森林
#include<bits/stdc++.h>
using namespace std;
int m,n;
int t[3002][3004];
int tt[3002][3004];
int dp[3003][3004];
int ans=0;
template<class T>inline void read(T &res)
{
	char c;T flag=1;
	while((c=getchar())<'0'||c>'9')if(c=='-')flag=-1;res=c-'0';
	while((c=getchar())>='0'&&c<='9')res=res*10+c-'0';res*=flag;
}



int main()
{
	read(n);
	read(m);
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=m;j++)
		{
			int xx;
			read(xx);
			t[i][j]=xx;
		}		
	}
	
			dp[n][0]=1;
	
	for(int i=n;i>=1;i--)
	{
		for(int j=1;j<=m;j++)	
		{
			if(t[i][j]) continue;
			dp[i][j]=dp[i][j-1]+dp[i+1][j];
			dp[i][j]=dp[i][j]%2333;
		}
	}
	printf("%d\n",dp[1][m]%2333);		
}
C

「土」秘法地震  二维差分

#include<bits/stdc++.h>
using namespace std;
int n,m,k;
int a[1004][1004];
char  s[1004][1004];
int main()
{
	scanf("%d%d%d",&n,&m,&k);
	for(int i=1;i<=n;i++)
	{
//		for(int j=1;j<=m;j++)
//		{
			scanf("%s",s[i]+1);
//		}
	}
	
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=m;j++)
		{
			a[i][j]=s[i][j]-'0'+a[i-1][j]+a[i][j-1]-a[i-1][j-1];
//			printf("%d ",a[i][j]);
		}
//		printf("\n");
	}
	
	int ans=0;
	for(int i=1;i<=n-k+1;i++)
	{
		for(int j=1;j<=m-k+1;j++)
		{
			int s=a[i+k-1][j+k-1]-a[i-1][j+k-1]-a[i+k-1][j-1]+a[i-1][j-1];
			if(s)
			{
				
			 ans++;
//			printf("%d %d\n",i,j);
			}
		}
	}
	
	printf("%d\n",ans);
	
}
D

「金」初心如金   异或运算性质

#include<bits/stdc++.h>
using namespace std;
long long  n;
int main() 
{
	cin>>n;
	long long  x;
	scanf("%d",&x);//x必为奇数
	// 奇 ^ 1 = 偶
	// 奇 ^ 0 = 奇 
	for(int i=0;i<n-1;i++)
	{
		scanf("%d",&x);
		if(x%2) printf("0\n");
		else printf("1\n");
	}
}
F

「水」悠悠碧波  哈希处理

#include<bits/stdc++.h> 
#define ull unsigned long long
const ull B= 10000007;
using namespace std;
vector<int> aa;
char s[1000006];
int l=0;
int maxl;
int ma()
{
	int ans=0;
	ull ah=0,bh=0;
	ull t=1;
	for(int i=0;i<l/3-1;i++)
	{
		ah=ah*B+s[i];
		bh=bh+s[l-1-i]*t;
		if(ah==bh) 
		{
		aa.push_back(i+1);
		ans++;
		}
		t*=B;
//		printf("ans=%d\n",ans);
	}
	return ans;
}

int pd(int lm)
{
	ull t=1;
	for(int i=0;i<lm;i++) t*=B;
	
	ull ah=0,bh=0;
	for(int i=0;i<lm;i++) ah=ah*B+s[i];
	for(int i=0;i<lm;i++) bh=bh*B+s[i];
	
	for(int i=lm;i<l-lm;i++)
	{
		bh=bh*B+s[i]-s[i-lm]*t;
		if(i-lm>=lm&&bh==ah) return 1;
	}
	return 0;
}
int main()
{
	cin>>s;
    
	l=strlen(s);
	int maxl=ma();
//	printf("maxl=%d\n",maxl);
	for(int i=maxl;i>=1;i--)
	{
//			printf("i=%d\n",aa[i-1]);
		if(pd(aa[i-1])) 
		{
			for(int j=0;j<aa[i-1];j++)
			{
				printf("%c",s[j]);
			}
			printf("\n");
			return 0;
		}
		
	}
	
}
G

「金」点石成金   dfs

#include<bits/stdc++.h>
#define ll long long 
using namespace std;
ll a[20],b[20],c[20],d[20];
ll cf=0,mf=0;
int n;
ll ans=0;
void dfs(int i,int way)
{
	
	if(i==n)
	{
	ans=max(ans,cf*mf);
	return ;
		
	}
	
	ll  t;
//	i++;
	
	cf+=a[i];
	t=mf;
	mf=max(0*1ll,mf-b[i]);
	dfs(i+1,1);
	
	mf=t;
	cf-=a[i];
		
	t=cf;
	cf=max(0*1ll,cf-d[i]);
	mf+=c[i];
	dfs(i+1,0);
	cf=t;
	mf-=c[i];
	
	
}
int main()
{
//	cin>>n;
	scanf("%d",&n);
	for(int i=0;i<n;i++)
	{
//		printf("?\n");
//		cin>>a[i]>>b[i]>>c[i]>>d[i];
		scanf("%lld%lld%lld%lld",&a[i],&b[i],&c[i],&d[i]);
	}
	
	ll  t;
	
	int i=0;
	cf+=a[i];
	t=mf;
	mf=max(0*1ll,mf-b[i]);
	dfs(1,1);
	mf=t;
	cf-=a[i];
	
	
	t=cf;
	cf=max(0*1ll,cf-d[i]);
	mf+=c[i];
	dfs(1,0);
	cf=t;
	mf-=c[i];
	
	printf("%lld\n",ans);
	
}
H

「土」巨石滚滚   贪心  排序

#include<bits/stdc++.h>
using namespace std;
long long n,m;
int q;
int Q[500005];
struct node
{
	long long  a,b,c;
}A[500005];

bool cmp1(node & A,node & B)
{
	return A.a<B.a;
}

bool cmp2(node & A,node & B)
{
	return A.b>B.b;
}

bool cmp3(node & A,node & B)
{
	return A.c>B.c;
}
int main()
{
	
	cin>>q;
	while(q--)
	{
		scanf("%lld%lld",&n,&m);
		int num=0;
		for(int i=0;i<n;i++)
		{
			scanf("%lld%lld",&A[i].a,&A[i].b);
			
			A[i].c=A[i].b-A[i].a;			
			if(A[i].c>0) num++;
		}
		
		
		sort(A,A+n,cmp3);//收益为正 的 越靠前 
		sort(A,A+num,cmp1);//确保收益为正中 代价最小越靠前 
		sort(A+num,A+n,cmp2);//收益为负中  恢复量越多越靠前  
		//不能 代价越小越靠前 因为   所有都能撞的条件为  消耗为 -(A[num~n].c-A[n].b)  最后一个的收益获取没意义  
		//则需要使最后浪费的那个收益最小 
		
		int flag=0;
		for(int i=0;i<n;i++) 
		{
			if(m<A[i].a)
			{
				flag=1;
				break;
			}
			m+=A[i].c;
		}
		if(flag)printf("No\n");
		else printf("Yes\n");
	}
}
 
发布了44 篇原创文章 · 获赞 6 · 访问量 1181

猜你喜欢

转载自blog.csdn.net/qq_43868883/article/details/103836666