2012春季ACM内部测试赛3

A:http://acm.sdut.edu.cn/web/problem.php?action=showproblem&problemid=2372

题意是给定一个n*m的矩形,初始颜色都为0(代表一种颜色)然后给你一个r*c的矩形刷子可以讲r*c内部的颜色0或者是1变为相反色(注意一共有0,1两种颜色,他俩互为相反色)。

对于每一个出现的1,可定会至少被刷过一次,我们只要很据目标矩阵统计,遇到1是时就将r*c的大小的矩阵进行翻转,如果出现i+r >n 或者 j + c > m 则表明无法实现。注意这里的ij是map[i][j] = 1 的情况、、

View Code

 

http://acm.sdut.edu.cn/web/problem.php?action=showproblem&problemid=2373

给一个n*m的棋盘,而且任意相邻两单元颜色不同。求最多能够得到多少个8*8且右下角为白色的8*8棋盘。直接讨论最右下角(n-7)*(m-7)这里把所有情况都包括了,然后查询有效1的个数即可,如果n-7或m-7存在偶数则白黑色各占一半,否则,右下角的颜色多1

View Code

C:http://acm.sdut.edu.cn/web/problem.php?action=showproblem&problemid=2374

给顶一个矩形,沿平行于短边的方向且开,确定好半径,好高。求出能组成的圆柱的最大体积。。

我分的三种情况觉得这样好理解一些,基本上和队长一样。

1:半径确定的情况:半径为w/2,高为w这样圆柱体就确定了,只要合法(h - w >= pi*w)就是确定的体积;

2:半径不确定的情况:高确定为w,则半径最大取值为(h/(2*pi+2)),还要判断半径的合法性(x < w/2.0)

3半径(r)不确定的情况,高也不确定(h - 2*r)

此时v = pi*r*r(h-2*r); v = pi*h*r*r-2*pi*r*r*r;

对v求导。。。然后确定的极值得点min(w/2*pi,h/3);

View Code
#include <cstdio>
#include <cstring>
#include <cmath>
#include <iostream>
using namespace std;
double pi = acos(-1.0);
int main()
{
double s1,s2,s3;
double w,h;
while (scanf("%lf%lf",&w,&h))
{
s1 = s2 = s3 = 0;
if (w == 0 && h ==0 )break;
if (h - w >= pi*w)
s1 = pi*w*w*w/4.0;
double x = (h/(2*pi+2));
if (x < w/2.0)
s2 = pi*(x*x)*w;
x = min((h/3.0),w/(2*pi));
s3 = pi*x*x*(h - 2*x);
//printf("%.2lf %.2lf %.2lf\n",s1,s2,s3);
printf("%.3lf\n",max(s1,max(s2,s3)));
}
return 0;
}

D: 水题。。

F:http://acm.sdut.edu.cn/web/problem.php?action=showproblem&problemid=2377

原来做过的题目RMQ和线段树的题目。我用的RMQ算法

代码:http://www.cnblogs.com/E-star/archive/2011/12/04/2275284.html

E :http://acm.sdut.edu.cn/web/problem.php?action=showproblem&problemid=2376

就是一个递归建树,然后层次遍历的问题。。。难的是在于怎么建树,。。递归下降式建树、、

View Code

 

Ghttp://acm.sdut.edu.cn/web/problem.php?action=showproblem&problemid=2378

才开始做只是想到了枚举O(n^3)没有考虑剪枝能过。。哎。思考不够全面。。

View Code
#include <cstdio>
#include <cstring>
#include <cmath>
#include <time.h>
#include <iostream>
using namespace std;
const int m = 2000;
const int n = 1000000;
int main()
{
int i,j,k,d;
for (i = 1; i < m; ++i)
{
if (4*i > m || i*i*i*i > n*m) break;
for (j = i; j < m; ++j)
{
if (i + 3*j > m || i*j*j*j > n*m) break;
for (k = j; k < m; ++k)
{
if (i +j + 2*k > m || i*j*k*k > n*m) break;
int x = i*j*k - n;
if (x <= 0) continue;
d = (i+j+k)*n/x;
if (d > 0 && d >= k && (i+j+k+d)*n == i*j*k*d && i + j + k + d <= m && i*j*k*d <= m*n)
printf("%.2lf %.2lf %.2lf %.2lf\n",i/100.0,j/100.0,k/100.0,d/100.0);
}
}
}
return 0;
}




posted @ 2012-03-12 22:11  E_star  阅读(289)  评论(0编辑  收藏  举报