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