Problem A URAL 1181
题目大意就是说有一个N边形,让你做N-3条边,让他们的每个三角形的三个顶点颜色都不相同。
这里有一个引理就是如果多边形三个颜色都有,而且两两相邻不同色,那么只要找到相邻的三个顶点,判断两端的两个是否相同,如果不同可以吧中间的点去掉,把两端连接起来,这样形成的新的多边形依然有解,再递归求解。证明过程可以参见我最敬佩的章爷http://blog.csdn.net/l383137093/article/details/9501019
相邻三点的两种判断情况
还有这些天来做题的一个总结就是,不管有多急,还是得吧代码写得简明一些,好懂一些,有时候自己的都看不懂,以后做题得好好思量一下了
#include <stdio.h>
#include <string.h>
#define mem(a) memset(a,0,sizeof(a))
#define MAXN 1005
int Color(char a){return (a == 'R') ? : ((a == 'G')? : );}//判断颜色 struct node{int color,next;} point[MAXN];//用于构建循环链表
int N,num[];
char str[MAXN]; int main()
{
while(~scanf("%d", &N))
{
mem(num); mem(str);
scanf("%s",str);
int i,flag = ;
for(i=;i<N;i++)
{
if(str[i]==str[(i+)%N]){flag = ;break;}//如果有两个相邻的相等的话(其实题目数据不会有这样的情况)
num[Color(str[i])]++;//相应颜色的值加1
point[i].color = Color(str[i]);
point[i].next = (i<N-) ? i+ : ;//使构成环形链表
}
if(flag || !num[] || !num[] || !num[])//如果只有两种颜色或则有相邻的相同
{
printf("0\n");
continue;
}
printf("%d\n",N-);
int now = ;//从第0个开始往后找
while()
{
int next1 = point[now].next;//next1是now的下一个点,
int next2 = point[next1].next;//next2是后两个点
if(num[] == || num[] == || num[] == )//如果某一个颜色的点的个数等于1就直接把它与其他相对的顶点链接
{//在这里我被坑惨了,以为只需要判断当前点的颜色是不是会是1,结果TLE了N回,桑都必须的判断!!!!!
while(num[point[now].color]!=)now = point[now].next;//找到某个颜色的顶点个数只为1个点
next1 = point[now].next;//下面是将这个点与其他对顶点链接
next2 = point[next1].next;
while(point[next2].next != now)
{
printf("%d %d\n",now+, next2+);
next2 = point[next2].next;
}
break;//全部已经连接完全,结束
}
if(point[now].color != point[next2].color)//如果某个三角形三个顶点都不相同的话
{
num[point[next1].color] --;//吧中间的点去掉
point[now].next = next2;//当前点的下一个成为后两个的点
printf("%d %d\n",now+, next2+);
}
now = point[now].next;
}
}
return ;
}
Problem B POJ 1579
题目意思是说有一个地推公式,如果直接递归下去肯定会相当耗时间,问怎么做
其实很简单。既然直接递推会超时,那是因为之间有很多重复的计算,那我们就只需要,记忆化遍历一遍,将每一步的答案都放在一个数组中,输入前便利一遍,那以后就不再需要遍历。直接一次0Ms过
#include <stdio.h> int d[][][];
int vis[][][]; int dfs(int a,int b,int c)
{
if(vis[a][b][c])return d[a][b][c];
vis[a][b][c] = ;
if(a<= || b<= || c<=)return d[a][b][c] = ;
if(a<b && b<c) return d[a][b][c] = dfs(a,b,c-)+dfs(a,b-,c-)-dfs(a,b-,c);
return d[a][b][c] = dfs(a-, b, c) + dfs(a-, b-, c) + dfs(a-, b, c-) - dfs(a-, b-, c-);
}
int main()
{
dfs(,,);
int a,b,c;
while(~scanf("%d%d%d",&a,&b,&c))
{
if(a==- && b==- && c==-)break;
printf("w(%d, %d, %d) = ", a, b, c);
if(a<= || b<= || c<=)
{
printf("1\n");
continue;
}
if(a> || b> || c>)a=b=c=;
printf("%d\n",dfs(a,b,c));
}
return ;
}
Problem C POJ 1845
当时第一眼看到这道题,就想着是不是有公式可以推导,于是花了半个多小时去计算。最后突然发现。。。。
一个数可以写为他的素数的幂的乘积,即若N = P1K1 * P2k2 * …… pnkn,那这样的话我们可以把它的所有因子拆分,写为
最高次 拆分情况
0 1
1 p1 + p2 + p3 + ...... +pn
2 p1^2 + p2^2 + ...... +pn^2 + p1p2 + p1p3 + ...... +pn-1pn
3 p1^3 + ... ...
......
k1+k2+...+kn p1^k1 p2^k2......pn^kn
由于上面的式子包含了 P1K1 * P2k2 * …… pnkn的所有任意k个之间的所有组合,所以不难得出上面所有因子的和就是
(1 + p1 + p1^2 + p1^3 +...... + p1^k1) * (1 + p2 + p2^2 + p2^3 + ...... + p2^k2) * ......
于是原题就变成了求n个上面蓝色和式子的乘积,而由于ki可能会很大,所以需要两次二分才能求出这个和(正好之前看到过^.^)
例:1+p^1+p^2+p^3+p^4+p^5 = (1+p^1+p^2)*(1+p^3)
这样的话计算量由原来的n=6减少到了n/2+1=4次,而后面红色部分又可以递归求出
所以复杂度就降到了O(n*log(n)*log(k))n是素因子的个数,k是最高的幂
只是可惜比赛时候没有搞出来=。=!!。。。。。。。。真是纠结。。。
代码:
#include <stdio.h>
#include <string.h>
#define mem(a) memset(a, 0, sizeof(a))
__int64 mod = ;
__int64 a[],p[],c[];
__int64 A,B,num; __int64 pow_mod(__int64 m,__int64 n)//快速幂
{
if(n == )return %mod;
if(n == )return m%mod;
__int64 ans = pow_mod(m, n/);
ans *= ans;
if(n% == )ans *= m;
return ans % mod;
} void find_prime()//打印素数表
{
__int64 i,j;
num=;
mem(a); mem(p);
for(i=;i<=;i++)
{
if(!a[i])p[num++] = i;
for(j=;i*j<=;j++)
{
a[i*j]=;
}
}
} __int64 add(__int64 p,__int64 k)//计算p+p^2+...+p^k
{
if(k == )return ;
if(k%){
return (+ pow_mod(p,k/+))*(add(p,k/))%mod;
}
return ((+ pow_mod(p,k/+))*(add(p, k/-))+pow_mod(p,k/))%mod;
} int count_C()//用于统计每个速因子的最高次数,返回素因子的个数
{
int i,countt = ;
for(i=;i<num && A >= p[i];i++)
{
if(A%p[i] == )
{
__int64 key =;
while(A%p[i] == )
{
key++;
A/=p[i];
}
a[countt]=p[i];
c[countt]=B*key;
countt ++;
}
}
if(A!=){a[countt] = A;c[countt++]=B;}
return countt;
} int main()
{
find_prime();
while(~scanf("%I64d%I64d", &A, &B))
{
if(A <= || B == ){printf("1\n");continue;}
int i;
int num_prime = count_C();
__int64 ans = ;
for(i=;i<num_prime;i++)
{
ans = (ans * add(a[i],c[i]))%mod;
}
printf("%I64d\n", ans);
}
return ;
}
Problem E POJ 3922
博弈
由于之前对博弈是完全没有概念,所以比赛时候自然也就是不可能AC的了。之后看了一点点有关博弈的思想,发现那完全不是我等人能够理解的透的,所以立马在网上寻找结题报告,经过了良久,才对这个题有了一点点认识,可以参见博客http://blog.csdn.net/acm_cxlove/article/details/7836544
于是随着这个思路写了一段代码(其实和题解的代码几乎已经是相差无几了),暂且挂在这里,慢慢捉摸
#include <stdio.h> int a[],b[];
int main()
{
int n,k;
int T = ,Case = ;
while(~scanf("%d",&T))while(T--)
{
scanf("%d%d",&n,&k);
a[] = b[] = ;
int i=,j=;
while(n > a[i])
{
i++;
a[i] = b[i-] + ;
while(a[j+] * k < a[i])
{
j++;
}
if(k * a[j] < a[i])
{
b[i] = b[j] + a[i];
}
else b[i] = a[i];
}
printf("Case %d: ",Case++);
if(n == a[i])printf("lose\n");
else
{
int ans ;
while(n)
{
if(n >= a[i])
{
n -= a[i];
ans = a[i];
}
i --;
}
printf("%d\n",ans);
}
}
return ;
}
终于是把结题报告写出来了 看我的另一篇随笔 http://www.cnblogs.com/gj-Acit/p/3219280.html
Problem G HDU 4608
暴力枚举
#include <stdio.h>
#include <string.h>
char str[]; int calc()
{
int len = strlen(str);
int i,ans = ;
for(i=;i<len;i++)
{
ans+=(str[i] - '');
}
return ans;
} void add()
{
int i,ans = ;
for(i=;str[i];i++)
{
str[i]-='';
int a=str[i]+ans;
ans=a/;
str[i]=a%;
str[i]+='';
}
if(ans)str[i]='';
} int main()
{
int T;
while(~scanf("%d", &T))while(T--)
{
memset(str,,sizeof(str));
scanf("%s",str);
strrev(str);
add();
int a = calc();
while(a%)
{
add();
a=calc();
}
strrev(str);
printf("%s\n",str);
}
return ;
}
Contest 7.23(不知道算什么)的更多相关文章
-
ZOJ3703 Happy Programming Contest 2017-04-06 23:33 61人阅读 评论(0) 收藏
Happy Programming Contest Time Limit: 2 Seconds Memory Limit: 65536 KB In Zhejiang University P ...
-
不知道算不算另类的ASP.NET MVC4 Ajax分页
以往用Ajax来实现无刷新分页,用户一按F5,页数就记不住了,点了一个链接也是同一个问题,再想回退回来,就回到第一页了.上次看到一篇文章,说到window.location.hash的用途,于是萌生了 ...
-
hexo的next主题博客中加入分类页面的js,实现多级目录,并且能够点击展开,隐藏下级目录~(不知道算不算深度优化~~~)
个人博客:https://mmmmmm.me 源码:https://github.com/dataiyangu/dataiyangu.github.io 多级标题 在自己的xxxx.md文件中做如下修 ...
-
Openjudge-计算概论(A)-球弹跳高度的计算
描述: 一球从某一高度落下(整数,单位米),每次落地后反跳回原来高度的一半,再落下.编程计算气球在第10次落地时,共经过多少米? 第10次反弹多高?输入输入一个整数h,表示球的初始高度.输出输出包含两 ...
-
bzoj1612 / P2419 [USACO08JAN]牛大赛Cow Contest(Floyd)
P2419 [USACO08JAN]牛大赛Cow Contest Floyd不仅可以算最短路,还可以处理点之间的关系. 跑一遍Floyd,处理出每个点之间是否有直接或间接的关系. 如果某个点和其他$n ...
-
GL_ARRAY_BUFFER 和 GL_ELEMENT_ARRAY_BUFFER
转载请注明出处.系列教程: webgl-lesson.wysaid.org 第七话, 了解OpenGL的几种Array Buffer,实现大量顶点的批量绘制, 以及映射纹理坐标 每一话都间隔很久,其实 ...
-
uboot完全手册---14
1. u-boot介绍 本次移植采用的是U-Boot-1.2.0版本. 3. U-Boot源码分析 3.1 源码入口的解释 可能大多数的同学上网查资料后都了解到,stage1阶段的启动代码,主要就在s ...
-
转 sql注入
1.判断有无注入点 ; and 1=1 and 1=2 2.猜表一般的表的名称无非是admin adminuser user pass password 等.. and 0<>(selec ...
-
杭电1708Fibonacci String
Fibonacci String Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
随机推荐
-
C 盘的不速之客
C 盘的报告内容既然上GB的空间 操作系统版本 原来是微软这个查找解决异常关闭解决方案生成的报告 参考 How To Disable Vista Error Reporting Feature ...
-
不错的 iOS 工具
1.LSUnusedResources,移除不用图片资源
-
Orchard CRM 更新 - 同时支持 Microsoft Dynamics CRM 2011, 2013, 2015, 2016!
本版本支持: 使用Orchard 1.8.1 系统 Dynamics CRM 2015 DLL .Net Framework 4.5.2 演示版本: http://www.orchardcrm.com ...
-
detection reading
1512.07729v1 G-CNN an Iterative Grid Based Object Detector,先基于空间金字塔生成很多矩形框,然后把这些矩形框作为regions,进行fast ...
-
使AJAX调用尽可能利用缓存特性
优化网站设计(十四):使AJAX调用尽可能利用缓存特性 前言 网站设计的优化是一个很大的话题,有一些通用的原则,也有针对不同开发平台的一些建议.这方面的研究一直没有停止过,我在不同的场合也分享过这样的 ...
-
NSS_08 extjs表单验证
Extjs做了非常好的表单验证功能, 使用起来非常方便. 系统内置了4种验证功能,分别是alpha, alphanumeric,url, email, 在程序中可以直接使用,(可以结合allowBla ...
-
UML类图关系大全-转
1.关联 双向关联: C1-C2:指双方都知道对方的存在,都可以调用对方的公共属性和方法. 在GOF的设计模式书上是这样描述的:虽然在分析阶段这种关系是适用的,但我们觉得它对于描述设计模式内的类关系来 ...
-
HDU5739 Fantasia 树形dp + 点双缩点
这个题当时打多校的时候有思路,但是代码能力差,没有写出来 事后看zimpha巨巨的题解,看了觉得基本差不多 核心思路:就是找出割点,然后变成森林,然后树形dp就可以搞了 关键就在重新构图上,缩完点以后 ...
-
修改虚拟机内容导致oracle不能启动
虚拟机内存目前设置为4G,想要改变成2G,数据库启动时导致报targetmomory错误,解决办法如下: 1.查看分配的memory_target和memory_max_target大小 SQL> ...
-
初次从eclipse转到intellij idea上的一些经验
如果出现:mvn 请使用 -source 7 或更高版本以启用 diamond 运算符 这种问题 pom.xml里 <build>标签里面 需要加入这么一段 <plugins> ...