PKU 1186 hash
2009-10-14 01:53
218 查看
和2785是一样的,稍微不同n是可变的1<=n<=6
这里用递归来处理n代码会比较好,当时觉得6只是6枚举一下情况就好了
所以没用递归,而是枚举情况写出的代码比较繁琐
本可以1Y,没注意内存显示,开了两个int [20000000],MLE,改成15000000就AC了
代码如下
#include <stdio.h>
#include <math.h>
#include <algorithm>
using namespace std;
#define esp 1e-5
#define BIGNUM 15000000 // 20000000就MLE了
#define INF 2147483647
int K[7],P[7];
int ans;
int hash[BIGNUM],s[BIGNUM];
int HASH(int h)
{
h%=BIGNUM;
if (h<0) h+=BIGNUM;
return h;
}
void Add(int num,bool flag)
{
if (flag) num = -num;
int h = HASH(num);
while(hash[h]!=INF && hash[h]!=num)
h=(h+1)%BIGNUM;
if (flag)
ans += s[h];
else
hash[h] = num , s[h]++;
}
int main()
{
int n,m; scanf("%d%d",&n,&m);
for (int i=1;i<=n;i++)
scanf("%d%d",&K[i],&P[i]);
if (n==1)
{
printf("0/n");
return 0;
}
fill_n(hash,BIGNUM,INF);
for (int i=1;i<=m;i++)
{
if (n>=4)
for (int j=1;j<=m;j++) // 可以递归处理,达到深度n/2停止,这里没用递归,写得比较多
if (n>=6)
for (int k=1;k<=m;k++)
Add(K[1]*int(esp+pow(double(i),P[1]))+K[2]*int(esp+pow(double(j),P[2]))+K[3]*int(esp+pow(double(k),P[3])), 0);
else
Add(K[1]*int(esp+pow(double(i),P[1]))+K[2]*int(esp+pow(double(j),P[2])), 0);
else
Add(K[1]*int(esp+pow(double(i),P[1])), 0);
}
for (int i=1;i<=m;i++)
{
if (n>=3)
for (int j=1;j<=m;j++)
if (n>=5)
for (int k=1;k<=m;k++)
Add(K[n-2]*int(esp+pow(double(i),P[n-2]))+K[n-1]*int(esp+pow(double(j),P[n-1]))+K
*int(esp+pow(double(k),P
)), 1);
else
Add(K[n-1]*int(esp+pow(double(i),P[n-1]))+K
*int(esp+pow(double(j),P
)), 1);
else
Add(K
*int(esp+pow(double(i),P
)), 1);
}
printf("%d/n",ans);
}
这里用递归来处理n代码会比较好,当时觉得6只是6枚举一下情况就好了
所以没用递归,而是枚举情况写出的代码比较繁琐
本可以1Y,没注意内存显示,开了两个int [20000000],MLE,改成15000000就AC了
代码如下
#include <stdio.h>
#include <math.h>
#include <algorithm>
using namespace std;
#define esp 1e-5
#define BIGNUM 15000000 // 20000000就MLE了
#define INF 2147483647
int K[7],P[7];
int ans;
int hash[BIGNUM],s[BIGNUM];
int HASH(int h)
{
h%=BIGNUM;
if (h<0) h+=BIGNUM;
return h;
}
void Add(int num,bool flag)
{
if (flag) num = -num;
int h = HASH(num);
while(hash[h]!=INF && hash[h]!=num)
h=(h+1)%BIGNUM;
if (flag)
ans += s[h];
else
hash[h] = num , s[h]++;
}
int main()
{
int n,m; scanf("%d%d",&n,&m);
for (int i=1;i<=n;i++)
scanf("%d%d",&K[i],&P[i]);
if (n==1)
{
printf("0/n");
return 0;
}
fill_n(hash,BIGNUM,INF);
for (int i=1;i<=m;i++)
{
if (n>=4)
for (int j=1;j<=m;j++) // 可以递归处理,达到深度n/2停止,这里没用递归,写得比较多
if (n>=6)
for (int k=1;k<=m;k++)
Add(K[1]*int(esp+pow(double(i),P[1]))+K[2]*int(esp+pow(double(j),P[2]))+K[3]*int(esp+pow(double(k),P[3])), 0);
else
Add(K[1]*int(esp+pow(double(i),P[1]))+K[2]*int(esp+pow(double(j),P[2])), 0);
else
Add(K[1]*int(esp+pow(double(i),P[1])), 0);
}
for (int i=1;i<=m;i++)
{
if (n>=3)
for (int j=1;j<=m;j++)
if (n>=5)
for (int k=1;k<=m;k++)
Add(K[n-2]*int(esp+pow(double(i),P[n-2]))+K[n-1]*int(esp+pow(double(j),P[n-1]))+K
*int(esp+pow(double(k),P
)), 1);
else
Add(K[n-1]*int(esp+pow(double(i),P[n-1]))+K
*int(esp+pow(double(j),P
)), 1);
else
Add(K
*int(esp+pow(double(i),P
)), 1);
}
printf("%d/n",ans);
}
相关文章推荐
- pku 1186(DFS+hash)
- pku 2002 Squares 二分查找 或者 hash
- pku 1971 Parallelogram Counting(hash)
- pku 3349 Snowflake Snow Snowflakes(hash,最小表示法)
- 【BZOJ】【P2258】【pku2758 Checking the Text 文本校对】【题解】【hash】
- BZOJ 2258 pku2758 Checking the Text 文本校对 Splay+Hash
- PKU-1077 Eight (八数码单向BFS+HASH)
- POJ 1186 hash 线性探测再散列
- PKU ACM 3274 数组hash
- pku 3274 Gold Balanced Lineup(预处理,hash)
- hdu 1186(搜索+HASH)
- poj 1186(hash+dfs)
- poj 1186 方程的解数【折半dfs+hash】
- pku 2002 squares 几何的推导与hash表的优化
- 字典树 hash(代替map的映射) PKU2513
- pku 1077 Eight【八数码、广搜、hash判重】
- poj 1186 poj 1840 方程的解数 hash+枚举 (n/2)
- PKU 1186 方程的解数
- poj 1186 方程的解数(HASH,DFS)
- [数组hash] PKU 3274 Gold Balanced Lineup