A Abs Problem http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=5330

找规律题,构造出解。copyright@ts

 #include<cstdio>
int main() {
int n,big,sma,id;
while(~scanf("%d",&n)) {
if(n==) {
puts("1 1");
puts("");
puts("");
continue;
}
if(n==) {
puts("1 1");
puts("1 2");
puts("2 1");
continue;
}
if(!((n-)%)||!(n%)) {
sma=;
}
else {
sma=;
}
if(sma) {
if(n&) {
big=n;
id=;
}
else {
big=n-;
id=;
}
}
else {
if(n&) {
big=n-;
id=;
}
else {
big=n;
id=;
}
}
printf("%d %d\n",sma,big);
printf("%d",n);
for(int i=n-;i>=;i--) {
printf(" %d",i);
}
puts("");
if(id==||id==) {
for(int i=n-;i>=;i--) {
printf("%d ",i);
}
printf("%d %d %d\n",n-,n-,n);
}
else {
for(int i=n-; i>=; i--) {
printf("%d ",i);
}
printf("%d\n",n);
}
}
return ;
}

E Easy 2048 Again http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=5334

状态压缩dp,只需要存递减的状态。

 #include<cstdio>
#include<cstring>
#include<algorithm>
#define mt(a,b) memset(a,b,sizeof(a))
using namespace std;
const int M=;
const int all=<<;
int a[M],dp[][all];
int main(){
int t,n;
int to[];///将输入变成2的x次方
int p2[];///存2的i次方
p2[]=;
for(int i=;i<=;i++){
p2[i]=p2[i-]*;
}
to[]=;
to[]=;
to[]=;
to[]=;
while(~scanf("%d",&t)){
while(t--){
scanf("%d",&n);
for(int i=;i<=n;i++){
scanf("%d",&a[i]);
a[i]=to[a[i]];
}
mt(dp,-);
int pre=,now=;
dp[pre][]=;
for(int i=;i<=n;i++,now^=,pre^=){
for(int j=;j<all;j++){
if(~dp[pre][j]){
dp[now][j]=max(dp[now][j],dp[pre][j]);///不选
///下面是选
int t=j;///下一个状态
int k=a[i]-;
///dp中第二维0001表示有个2,0011表示有4,2,0111表示8,4,2
int q=(<<k)-;///q为( 比k低一位的位数全是1 )的数
int sum=p2[a[i]];///新得分
if(!(t&q)){///如果比k低的位全是0,才能合并
while((t&(<<k))){
sum+=p2[k+];
k++;
}
q=(<<k)-;
t&=~q;///把比k低的位数全变成0
t|=<<k;
}
else{
t=<<k;///不能合并,产生新递减序列,只有k位是1
}
dp[now][t]=max(dp[now][t],dp[pre][j]+sum);
}
}
}
int ans=;
for(int i=;i<all;i++){
ans=max(ans,dp[pre][i]);
}
printf("%d\n",ans);
}
}
return ;
}

G YY's Minions http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=5336

模拟题,怎么说怎么做。

 #include<cstdio>
#include<algorithm>
using namespace std;
const int M=;
char op[M];
int mat[][M][M],n,m,f,k,t;
struct G{
int t,x,y;
friend bool operator <(G a,G b){
return a.t<b.t;
}
}g[M*M];
int dx[]={-,-,-,,,,,};
int dy[]={-,,,-,,-,,};
int sum(int x,int y,int pre){
int res=;
for(int i=,tx,ty;i<;i++){
tx=x+dx[i];
ty=y+dy[i];
if(tx>=&&tx<=n&&ty>=&&ty<=m){
if(mat[pre][tx][ty]&){
res++;
}
}
}
return res;
}
int change(int pre,int num){
if(pre==){
if(num==) return ;
return ;
}
if(num==||num==) return ;
return ;
}
char tochar(int x){
if(x==) return 'X';
return x+'';
}
int main(){
while(~scanf("%d",&t)){
while(t--){
scanf("%d%d%d%d",&n,&m,&f,&k);
int pre=,now=;
for(int i=;i<=n;i++){
scanf("%s",op);
for(int j=;j<m;j++){
mat[pre][i][j+]=op[j]-'';
}
}
for(int i=;i<k;i++){
scanf("%d%d%d",&g[i].t,&g[i].x,&g[i].y);
}
sort(g,g+k);
for(int u=,head=;u<=f;u++,pre^=,now^=){
for(int i=;i<=n;i++){
for(int j=;j<=m;j++){
if(mat[pre][i][j]==){
mat[now][i][j]=;
continue;
}
int num=sum(i,j,pre);
mat[now][i][j]=change(mat[pre][i][j],num);
}
}
while(head<k&&g[head].t==u){
mat[now][g[head].x][g[head].y]=;
head++;
}
}
for(int i=;i<=n;i++){
for(int j=;j<=m;j++){
putchar(tochar(mat[pre][i][j]));
}
putchar('\n');
}
}
}
return ;
}

用vector就不用排序了。

 #include<cstdio>
#include<vector>
using namespace std;
const int M=;
char op[M];
int mat[][M][M],n,m,f,k,t;
struct G{
int x,y;
}p;
vector<G> g[M*M];
int dx[]={-,-,-,,,,,};
int dy[]={-,,,-,,-,,};
int sum(int x,int y,int pre){
int res=;
for(int i=,tx,ty;i<;i++){
tx=x+dx[i];
ty=y+dy[i];
if(tx>=&&tx<=n&&ty>=&&ty<=m){
if(mat[pre][tx][ty]&){
res++;
}
}
}
return res;
}
int change(int pre,int num){
if(pre==){
if(num==) return ;
return ;
}
if(num==||num==) return ;
return ;
}
char tochar(int x){
if(x==) return 'X';
return x+'';
}
int main(){
while(~scanf("%d",&t)){
while(t--){
scanf("%d%d%d%d",&n,&m,&f,&k);
int pre=,now=;
for(int i=;i<=n;i++){
scanf("%s",op);
for(int j=;j<m;j++){
mat[pre][i][j+]=op[j]-'';
}
}
for(int i=;i<=f;i++){
g[i].clear();
}
for(int i=,ti;i<k;i++){
scanf("%d%d%d",&ti,&p.x,&p.y);
g[ti].push_back(p);
}
for(int u=,head=;u<=f;u++,pre^=,now^=){
for(int i=;i<=n;i++){
for(int j=;j<=m;j++){
if(mat[pre][i][j]==){
mat[now][i][j]=;
continue;
}
int num=sum(i,j,pre);
mat[now][i][j]=change(mat[pre][i][j],num);
}
}
int lg=g[u].size();
for(int i=;i<lg;i++){
mat[now][g[u][i].x][g[u][i].y]=;
}
}
for(int i=;i<=n;i++){
for(int j=;j<=m;j++){
putchar(tochar(mat[pre][i][j]));
}
putchar('\n');
}
}
}
return ;
}

H Machine http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=5337

树的深搜。邻接表快一些

 #include<cstdio>
#include<cstring>
#include<vector>
#include<algorithm>
#define mt(a,b) memset(a,b,sizeof(a))
using namespace std;
const int M=;
struct G{
struct E{
int v,next;
}e[M<<];
int le,head[M];
void init(){
le=;
mt(head,-);
}
void add(int u,int v){
e[le].v=v;
e[le].next=head[u];
head[u]=le++;
}
}g;
vector<int> son[M];
int dfs(int u,int fa){
son[u].clear();
for(int i=g.head[u];~i;i=g.e[i].next){
int v=g.e[i].v;
if(v!=fa){
son[u].push_back(dfs(v,u));
}
}
sort(son[u].begin(),son[u].end());
int res=,ls=son[u].size();
for(int i=;i<ls;i++){
res=max(res,son[u][i]+ls-i-);
}
return res;
}
int main(){
int n;
while(~scanf("%d",&n)){
g.init();
for(int v=,u;v<=n;v++){
scanf("%d",&u);
g.add(u,v);
g.add(v,u);
}
printf("%d\n",dfs(,-));
}
return ;
}

vector慢一些

 #include<cstdio>
#include<vector>
#include<algorithm>
using namespace std;
const int M=;
vector<int> g[M],son[M];
int dfs(int u,int fa){
son[u].clear();
int lu=g[u].size();
for(int i=;i<lu;i++){
int v=g[u][i];
if(v!=fa){
son[u].push_back(dfs(v,u));
}
}
sort(son[u].begin(),son[u].end());
int res=,ls=son[u].size();
for(int i=;i<ls;i++){
res=max(res,son[u][i]+ls-i-);
}
return res;
}
int main(){
int n;
while(~scanf("%d",&n)){
for(int i=;i<=n;i++){
g[i].clear();
}
for(int v=,u;v<=n;v++){
scanf("%d",&u);
g[u].push_back(v);
g[v].push_back(u);
}
printf("%d\n",dfs(,-));
}
return ;
}

I Incircle and Circumcircle http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=5338

机智的用不对的三分过了。定义圆都在y轴,定义三角形一个点在圆心,定义三角形是等腰的。

 #include<cstdio>
#include<cmath>
const double eps=1e-;
double r,R;
double f(double y) {
double Y=*R*(-(r*r)/(y*y));
return fabs(Y-y-r);
}
double TernarySearch(double L,double R) { // 三分查找
while(R-L>eps) {
double LL=(L*+R)/;
double RR=(L+R*)/;
if(f(LL)<f(RR)) //f为对应的值 这里求最小值
R=RR;
else
L=LL;
}
return L;
}
int main(){
int t1,t2;
while(~scanf("%d%d",&t1,&t2)){
if(t1*>t2){
puts("NO Solution!");
continue;
}
r=t1;
R=t2;
double ansy=TernarySearch(r,R+R-r);
ansy+=r;
double tmp=ansy-r;
double sinxita=r/tmp;
double cosxita=sqrt(tmp*tmp-r*r)/tmp;
double a=ansy*tmp/sqrt(tmp*tmp-r*r);
double b=a;
double c=*a*r/tmp;
printf("%.18f %.18f %.18f\n",a,b,c);
}
return ;
}

end

ZOJ Monthly, August 2014的更多相关文章

  1. 浙大月赛ZOJ Monthly, August 2014

    Abs Problem Time Limit: 2 Seconds Memory Limit: 65536 KB Special Judge Alice and Bob is playing a ga ...

  2. 135 - ZOJ Monthly, August 2014

    135 - ZOJ Monthly, August 2014 A:构造问题,推断序列奇偶性.非常easy发现最小值不是1就是0.最大值不是n就是n - 1,注意细节去构造就可以 E:dp.dp[i][ ...

  3. ZOJ Monthly, November 2014

    做了一次月赛,没想到这么难,加上后来补上的题目也只有3个题.第一名也只有4个题啊啊啊啊~.其中两道还是水题.留坑慢慢补上来. 3832 Tilt Cylinder 给定如图所示有盖圆柱体,R,H,水面 ...

  4. ZOJ Monthly, June 2014 月赛BCDEFGH题题解

    比赛链接:点击打开链接 上来先搞了f.c,,然后发现状态不正确,一下午都是脑洞大开,, 无脑wa,无脑ce...一样的错犯2次.. 硬着头皮搞了几发,最后20分钟码了一下G,不知道为什么把1直接当成不 ...

  5. 记次浙大月赛 134 - ZOJ Monthly, June 2014

    链接 虽做出的很少,也记录下来,留着以后来补..浙大题目质量还是很高的 B 并查集的一些操作,同类和不同类我是根据到根节点距离的奇偶判断的,删点是直接新加一个点,记得福大月赛也做过类似的,并差集的这类 ...

  6. 137 - ZOJ Monthly, November 2014 - J Poker Face

    Poker Face Time Limit: 2 Seconds      Memory Limit: 65536 KB As is known to all, coders are lack of ...

  7. ZOJ Monthly, June 2014 解题报告

    A.Another Recurrence Sequence problemId=5287">B.Gears 题目大意:有n个齿轮,一開始各自为一组.之后进行m次操作,包含下面4种类型: ...

  8. ZOJ 4010 Neighboring Characters(ZOJ Monthly, March 2018 Problem G,字符串匹配)

    题目链接  ZOJ Monthly, March 2018 Problem G 题意  给定一个字符串.现在求一个下标范围$[0, n - 1]$的$01$序列$f$.$f[x] = 1$表示存在一种 ...

  9. ZOJ 4009 And Another Data Structure Problem(ZOJ Monthly, March 2018 Problem F,发现循环节 + 线段树 + 永久标记)

    题目链接  ZOJ Monthly, March 2018 Problem F 题意很明确 这个模数很奇妙,在$[0, mod)$的所有数满足任意一个数立方$48$次对$mod$取模之后会回到本身. ...

随机推荐

  1. oracle发送邮件

    1.创建发送邮件的存储过程 CREATE OR REPLACE PROCEDURE send_mail(p_recipient VARCHAR2, -- 邮件接收人 p_subject VARCHAR ...

  2. 兼容IE,chrome 等所有浏览器 回到顶部代码

    今天在博客园看到一片帖子回到顶部代码,索性就看了下,但是发现在非IE浏览器下可以运行,在IE浏览器下却运行不了. 故将其代码搬弄过来做了些许修改后,完美支持了IE下的运行. 主要实现功能代码文件: & ...

  3. 开放-封闭原则(OCP)

    对于僵化性的臭味,应用OCP原则之后,再进行同样的改动时,只需添加新代码,而不必改动已正常运行的代码. 扩展模块行为的方式通常是修改模块的Code,不允许修改的模块常常被认为是具有固定的行为. Ope ...

  4. linux工程管理工具make入门

    一.make工具的功能 1.主要负责一个软件工程中多个源代码的自动编译工作 2.还能进行环境检测.后期处理等工作: 3.make工具可以识别出工程中哪些文件已经被修改,并且在再次编译的时候只编译这些文 ...

  5. GDAL中RasterIO函数(把文件读取为一个一维数组)和ReadBlock函数(读取栅格数据块)

    CPLErr GDALRasterBand::RasterIO ( GDALRWFlag eRWFlag, int nXOff, int nYOff, int nXSize, int nYSize, ...

  6. chrome源码编译常见的错误解决

    最近编译chrome浏览器源码时,下载源码和一般的设置,网络中都有说明,而且一般的说明都是类似的,然后都说编译成功了,但本人没有试成功,碰到常见的2个错误,记录下,不知道大家碰到没有. 1.pytho ...

  7. ARC小知识

    ARC是iOS 5推出的新功能,全称叫 ARC(Automatic Reference Counting).简单地说,就是代码中自动加入了retain/release,原先需要手动添加的用来处理内存管 ...

  8. 《DNS服务缓存的建立》RHEL6

    安装dns软件包: 启动dns服务器 配置本地服务器dns域名解析: 查看dns的服务的端口是否打开: 解析百度测试: 安装dns缓存包: 再次访问解析百度

  9. FPGA笔记-读取.dat文件

    读取.dat图像文件 .dat文件是matlab生成的图像文件 initial begin // Initialize Inputs CLK = 0; RST = 1; IMAGE_DATA = 0; ...

  10. Linux mkisofs 创建光盘镜像文件(Linux指令学习笔记)

    mkisofs命令 创建光盘文件的系统的命令是mkisofs.光盘系统有多种格式,利用Linux系统提供的光盘文件系统创建 命令mkisofs,可以创建多种iso9660文件系统. 我们一般不用mki ...