2019牛客暑期多校训练营(第一场) 补题 A J F E

 

J: 比较两个分数大小,交叉相乘会爆longlong,我们可以先化成真分数(分子比分母小的分数)再比较就行。(正好在1e18内)

#include
using namespace std;
long long x,y,a,b;
int main()
{
    while(scanf("%lld %lld %lld %lld",&x,&a,&y,&b)!=EOF)
    {
        if(x/a>y/b)
            printf(">\n");
        else
        {
            if(x/aa*y)
                        printf(">\n");
                    else
                        printf("<\n");
            }
        }
    }
}
//100000000000000

A:题意:找出最大的p,使a,b数组1-p所有子区间的最小值下标相同。

我们用单调递增栈维护2个数组。。

比较每次弹出的数量,和时机是否相同。。如果不同,代表出栈的元素所维护的最小值的范围不同,即,区间最小值的位置不同。

比赛时我们队想的是用单调栈求出每个元素维护最小值的范围(即最大的区间,该元素是最小值)。

然后从前往后判断。过于,麻烦,现在想来直接弹出时进行判断即可,因为弹出时确定右边界,进栈时确定左边界。

#include
using namespace std;
const int maxn = 500000+77;
int a[maxn];
int b[maxn];
int s1[maxn],s2[maxn];
int w1[maxn],w2[maxn];
int main()
{
	int n;
	while(~scanf("%d",&n))
	{
		for(int i=1;i<=n;i++)
		scanf("%d",&a[i]);
		for(int i=1;i<=n;i++)
		scanf("%d",&b[i]);
		for(int i=0;i<=n+1;i++)
		s1[i]=0,s2[i]=0;
		a[n+1]=0;
		int p1=0,p2=0,ans=1,num=0;
		for(int i=1;i<=n;i++)
		{
		//	printf("%d     %d    %d-----%d  %d\n",i,p1,p2,s1[p1],s2[p2]);
			while(p1&&a[i]

F题 。   22倍的三角形面积。

不会证明。。。。 但是我们发现他是整数,直接用一个确定的三角形,取其内部的所有P点,p阶梯d设为0.0001,然后求出三个内三角形面积,找出最大值与总面积相比较,发现每次都是11/18。。然后用三角形坐标面积公式即可。

#include
using namespace std;
int main()
{
    long long  x1,y1,x2,y2,x3,y3;
    while(scanf("%lld %lld %lld %lld %lld %lld",&x1,&y1,&x2,&y2,&x3,&y3)!=EOF)
    {
        long long S=(x1*y3+x2*y1+x3*y2-x1*y2-x2*y3-x3*y1);
        if(S<0)
        S=-S;
        cout<<11*S<

E:首先你要会判断  给你一个字符串和n,m,它是否满足条件。

贪心的判断。。前面的A肯定优先当作“AB"中的A,前面的B肯定优先当作"BA”的B。

所以前n个A是AB的A,前m个B是BA的B,然后判断能不能对应即可。

 

以这个判断为基础进行递推关系。

dp[i][j]代表,字符串已经放了i个A,j个B。且满足条件的方案数(根据上面的贪心进行判断是否满足)。

 

如果dp[i+1][j]依然满足条件(即再放一个A) 

一、 还未放满n个AB的A 即:i

二、放满了AB的A  ,但有j个B,可以与j个A组成BA(注意前面都是合法递推过来,所以不会出现最前面连续大于n个A的情况,所以这样递推是合法的,---有新的B就可以再放A,不能放肯定就不会放A)。即:i - n < j;

若满足一、二。则dp[i+1][j]的方案数可以传递下去

 

如果dp[i][j+1]依然满足条件(即再放一个B) 

一、 还未放满m个BA的B 即:j

二、放满了BA的B  ,但有i个A,可以与i个B组成AB。即:j - m < i ;

同样,满足条件则可传递方案

 

#include
using namespace std;
#define ll long long
const ll MOD=1e9+7;
const int M=2e3+7;
ll dp[M][M];
int main()
{
    int n,m;
    while(~scanf("%d %d",&n,&m))
    {
        for(int i=0;i<=n+m;i++)
       		for(int j=0;j<=n+m;j++)
        		dp[i][j]=0;
        dp[0][0]=1;
       	for(int i=0;i<=n+m;i++)
        	for(int j=0;j<=n+m;j++)
        	{
        		//i<=n  AB的A还没放完,i-n<=	m-j 
        		if(i

 

 

你可能感兴趣的:(多校----牛客/hdu)