AtCoder Beginner Contest 130

C - Rectangle Cutting

题意:给定(0,0)(0,w),(0,h),(w,h)的矩形,给定坐标(x,y)问过这一点的直线切割矩形,使得小的的面积尽肯能大。

思路:思维题,尽可能大那么就是二分之一矩形的面积,最后判断这个点是不是在矩形正中央。

#include
using namespace std;
int main(){
	int w,h,x,y;
	cin>>w>>h>>x>>y;
	double m=(double)w/2*h;
	printf("%.12lf ",m);
	if(x*2==w&&y*2==h)
		puts("1");
	else puts("0");
}

D - Enough Array

题意:给定序列,选定区间使得区间里面的数之和大于等于k。

思路:前缀和加枚举。

#include
using namespace std;
typedef long long ll;
ll sum[100005];
int main(){
	int n;
	ll k;
	cin>>n>>k;
	ll x;
	sum[0]=0;
	ll ans=0;
	for(int i=1;i<=n;i++){
		cin>>x;
		sum[i]=sum[i-1]+x;	
	}
	int l=0,r=0;
	while(r<=n){
		if(sum[r]-sum[l]

E - Common Subsequence

题意:求公共子序列对的数量。

思路:dp...

#include
using namespace std;
const int mod=1e9+7;
int s[2005],t[2005];
typedef long long ll;
ll dp[2005][2005];
int main(){
	int n,m;
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++)
		scanf("%d",&s[i]);
	for(int i=1;i<=m;i++)
		scanf("%d",&t[i]);
	int sum;
	for(int i=1;i<=n;i++){
		sum=0;
		for(int j=1;j<=m;j++){
			sum+=dp[i-1][j];
			sum%=mod;
			if(s[i]==t[j]){
				dp[i][j]=sum+1;
				dp[i][j]%=mod;
			}
			else{
				dp[i][j]=dp[i-1][j];
			}
		}
	}
	ll ans=0;
		for(int j=1;j<=m;j++)
			ans+=dp[n][j],ans%=mod;
	printf("%lld\n",ans+1);
}

F - Minimum Bounding Box

题意:给定二维初始坐标和运动方向,每秒运动1个单位,你可以在任意时间内停止,问可以使得(max(x)-min(x))-(max(y)-min(y))的最小值是多少。

思路:三分.......

#include
using namespace std;
double x[100005],y[100005];
double dx[100005],dy[100005];
int n;
double check(double a){
	double mnx=1e18,mxx=-1e18,mny=1e18,mxy=-1e18;
	for(int i=0;i>n;
	char s;
	memset(dx,0,sizeof(dx));
	memset(dy,0,sizeof(dy));
	for(int i=0;i>x[i]>>y[i]>>s;
		if(s=='D')
			dy[i]=-1;
		if(s=='U')
			dy[i]=1;
		if(s=='R')
			dx[i]=1;
		if(s=='L')
			dx[i]=-1;
	}
	double l=0,r=1e9;
	double ans=1e18;
	for(int i=0;i<200;i++){
		double ll=(l*2+r)/3;
		double rr=(r*2+l)/3;
		double lll=check(ll),rrr=check(rr);
		ans=min(ans,lll);
		ans=min(ans,rrr);
		if(lll

 

你可能感兴趣的:(Atcoder)