枚举超时

糖果问题枚举会导致超时的。。

#include<stdio.h>
float mabs(float a)
{
if(a<0)
a=-a;
return (a);
}
int max(int a[4])
{
int i,j,t;
for(i=0;i<3;i++)
{
if(a[i]>a[i+1])
{
j=a[i+1];a[i+1]=a[i];a[i]=j;
}

}
//printf("%d%d%d %d\n",a[0],a[1],a[2],a[3]);
t=a[3];
return (t);
}
int min(int a[4])
{
int i,j,t;
for(i=0;i<3;i++)
{
if(a[i]<a[i+1])
{
j=a[i+1];a[i+1]=a[i];a[i]=j;
}
}
t=a[3];
//printf("%d%d%d%d\n",a[0],a[1],a[2],a[3]);
return (t);
}
int main()
{
int i,j,m,n,a[4]={0};
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
if(n==0) printf("YES\n1\n1\n3\n3\n");
else if(n==1)
{
if(n%2==0) printf("YES\n%d\n%d\n%d\n",a[0],a[0]/2,a[0]*1.5);
else printf("YES\n%d\n%d\n%d\n",a[0]+1,(a[0]/2)+1,(a[0]/2)+1+a[0]);
}
else if(n==2)
{
float e=0,r,w;
int h=0,b[2]={0},f,i,j;
//printf("%d%d%d%d\n",a[0],a[1],a[2],a[3]);
for(i=1;i<=1000000;i++)
{
for(j=1;j<=1000000;j++)
{
a[2]=i;
a[3]=j;
for(f=0;f<2;f++)
{
b[f]=a[f];
}
//printf("%d%d%d\n",w,e,r);
//printf("%d%d%d%d\n",a[0],a[1],a[2],a[3]);
w=(a[0]+a[1]+a[2]+a[3])/4.0;
e=max(a)-min(a);
//printf("%d%d%d%d\n",a[0],a[1],a[2],a[3]);
r=(a[0]+a[1]+a[2]+a[3]-max(a)-min(a))/2.0;
//printf("%f %f %f\n",w,e,r);
if((mabs(w-e)<1e-6)&&(mabs(e-r)<1e-6))
{
printf("YES\n%d\n%d\n",i,j);
h++;
break;
}
for(f=0;f<2;f++)
{
a[f]=b[f];
}
}
if(h!=0) break;
}
if(h==0)
printf("NO");
}
else if(n==3)
{
float e=0;
float r,w;
int h=0,b[3]={0};
//printf("%d%d%d%d\n",a[0],a[1],a[2],a[3]);
for(i=1;i<=1000000;i++)
{
a[3]=i;
for(j=0;j<3;j++)
{
b[j]=a[j];
}
//printf("%d%d%d\n",w,e,r);
//printf("%d%d%d%d\n",a[0],a[1],a[2],a[3]);
w=(a[0]+a[1]+a[2]+a[3])/4.0;
e=max(a)-min(a);
//printf("%d%d%d%d\n",a[0],a[1],a[2],a[3]);
r=(a[0]+a[1]+a[2]+a[3]-max(a)-min(a))/2.0;
//printf("%f %f %f\n",w,e,r);
if(((w-e)<1e-6)&&((e-r)<1e-6))
{
printf("YES\n%d\n",i);
h++;
break;
}
for(j=0;j<3;j++)
{
a[j]=b[j];
}
}
if(h==0)
printf("NO");
}
else if(n==4)
{
float e=0;
float r,w;
//printf("%d%d%d\n",w,e,r);
//printf("%d%d%d%d\n",a[0],a[1],a[2],a[3]);
w=(a[0]+a[1]+a[2]+a[3])/4.0;
e=max(a)-min(a);
//printf()
//printf("%d%d%d%d\n",a[0],a[1],a[2],a[3]);
r=(a[0]+a[1]+a[2]+a[3]-max(a)-min(a))/2.0;
//printf("%f %f %f\n",w,e,r);
if(mabs((w-e)<1e-6)&&(mabs(e-r)<1e-6))
printf("YES");
else
printf("NO\n");
}
return 0;
}

时间: 2024-08-25 15:06:21

枚举超时的相关文章

敌兵布阵 线段树

敌兵布阵 C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他手下Tidy又开始忙乎了.A国在海岸线沿直线布置了N个工兵营地,Derek和Tidy的任务就是要监视这些工兵营地的活动情况.由于采取了某种先进的监测手段,所以每个工兵营地的人数C国都掌握的一清二楚,每个工兵营地的人数都有可能发生变动,可能增加或减少若干人手,但这些都逃不过C国的监视. 中央情报局要研究敌人究竟演习什么战术,所以Tidy要随时向Derek汇报某一段连续的工兵营地一共有多少人,例如Derek问:“Tid

hdu 1757 (矩阵快速幂) 一个简单的问题 一个简单的开始

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1757 题意不难理解,当x小于10的时候,数列f(x)=x,当x大于等于10的时候f(x) = a0 * f(x-1) + a1 * f(x-2) + a2 * f(x-3) + …… + a9 * f(x-10); 所求的是f(x)取m的模,而x,m,a[0]至a[9]都是输入项 初拿到这道题,最开始想的一般是暴力枚举,通过for循环求出f(x)然后再取模,但是有两个问题,首先f(x)可能特别大,其

ZOJ Problem Set - 2563 Long Dominoes 【状压dp】

题目:ZOJ Problem Set - 2563 Long Dominoes 题意:给出1*3的小矩形,求覆盖m*n的矩阵的最多的不同的方法数? 分析:有一道题目是1 * 2的,比较火,链接:这里 这个差不多,就是当前行的状态对上一行有影响,对上上一行也有影响.所以 定义状态:dp[i][now][up]表示在第 i 行状态为now ,上一行状态为 up 时的方案数. 然后转移方程:dp[i][now][up] = sum ( dp[i-1][up][uup] ) 前提是合法 合法性的判断是比

nyoj-矩形的个数

找规律!!!!!别忘了处理溢出!!!!! 假设矩形有1行,行有n种可能,列有n+n-1+……+1种可能 假设矩形有2行,行有n-1种可能,列有n+n-1+……+1种可能 …… 假设矩形有n行,行有1种可能,列有n+n-1+……+1种可能 总共a*(a+1)*b*(b+1)/4种可能 int main() { int a,b; while(cin >> a >> b) cout <<(long long) a*(a+1)*b*(b+1)/4<< endl; r

NBUTOJ 1643 - 阶乘除法 - [数学题]

题目链接:https://ac.2333.moe/Problem/view.xhtml?id=1643 问题描述 输入两个正整数 n, m,输出 n!/m!,其中阶乘定义为 n!= 1*2*3*...*n (n>=1). 比如,若 n=6, m=3,则 n!/m!=6!/3!=720/6=120. 是不是很简单?现在让我们把问题反过来:输入 k=n!/m!,找到这样的整数二元组(n,m) (n>m>=1). 如果答案不唯一,n 应该尽量小.比如,若 k=120,输出应该是 n=5, m=

poj 2965 The Pilots Brothers&#39; refrigerator[ 枚举 ]

传送门:http://poj.org/problem?id=2965 思路:二进制枚举,递归输出路径.G++ 900+Ms勉强过,C++超时. 代码: #include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<vector> #include<queue> #include<stack> #include<map>

POJ 1050 To the Max 枚举+dp

大致题意: 求最大子矩阵和 分析: 一开始想复杂了,推出了一个状态方程:d[i][j]=max(d[i][j-1]+…,d[i-1][j]+…).写着写着发现上式省略的部分记录起来很麻烦. 后来发现n最大100,干脆直接枚举行,先枚举所有行的情况,然后将矩阵压缩为数列,最后用最大子段和求解.写着写着感觉就会超时,毕竟出现了四层循环嵌套.结果过了,说明测试数据有点水. #include <iostream> #include <cstdio> #include <cmath&g

!HDU 4282 A very hard mathematic problem-卡时间-(二分枚举)

题意:x^z+y^z+xyz=k,给定k求出满足该式子的x,y有多少种.(x<y,z>1,k<2^31) 分析: 一看就是卡时间的题,这种题一般方法是枚举,但是要先分析一下数据的关系,把枚举的变量的数据范围缩小到可接受的程度:另外二分在这种题里是常用的方法. 本题要复杂一点,有三个变量都要枚举.首先z作为幂,而k<2^31,所以z不可能超过31:其次考虑z取最小值2的情况,此时有(x+y)^2=k,估算得x+y<=10^4.5,也就是x+y不超过40000,这就把x和y的范围

!hdu 4091--贪心、枚举--(思维)

题意:有一个容量为n的箱子,有两种珠宝,占的体积和价值分别是s1,v1,s2,v2,求能装下的最大的价值总量. 分析:刚开始以为是背包问题,但其实没那么简单:后来分情况讨论还是不行:后来又暴力枚举,当然是超时了.正确做法是有一部分是用背包的贪心,另一部分用枚举!现在就是看哪一部分用贪心. 看别人的题解是:L = LCM(s1,s2),可是知道大于L的部分就用价值比高的,所以n%L的部分枚举,其余部分贪心,不过这样可能得到的还不是最优解,所以n%L+L的部分枚举,这样就可以了,具体原因我还没想明白