- 24点游戏
- 2014-01-20 15:10:19 @
5 5 5 5
5*5-5/5=25-1=24
应该是这样的对吧。。
但是用AC的程序跑了一遍结果是0。。
是数据弱 还是这样算本身就有问题。
14 条评论
-
TenderRun LV 10 @ 2015-10-04 18:51:26
###其实有些AC程序是一个一个枚举的,要修正这个错误,只需要记录扑克两两组合可得到的结果,再两对两对地匹配即可
###像这样:
P113424点游戏Accepted
记录信息
评测状态 Accepted
题目 P1134 24点游戏
递交时间 2015-10-04 19:26:24
代码语言 C++
评测机 VijosEx
消耗时间 84 ms
消耗内存 1472 KiB
评测时间 2015-10-04 19:26:25
评测结果
编译成功foo.cpp: In function 'int main()':
foo.cpp:78:12: warning: suggest parentheses around '&&' within '||' [-Wparentheses]
if(x!=0&&(double)y/x==24||y!=0&&(double)x/y==24)ans=1;
^
测试数据 #0: Accepted, time = 0 ms, mem = 1464 KiB, score = 10
测试数据 #1: Accepted, time = 0 ms, mem = 1464 KiB, score = 10
测试数据 #2: Accepted, time = 0 ms, mem = 1468 KiB, score = 10
测试数据 #3: Accepted, time = 0 ms, mem = 1468 KiB, score = 10
测试数据 #4: Accepted, time = 15 ms, mem = 1464 KiB, score = 10
测试数据 #5: Accepted, time = 15 ms, mem = 1464 KiB, score = 10
测试数据 #6: Accepted, time = 12 ms, mem = 1464 KiB, score = 10
测试数据 #7: Accepted, time = 12 ms, mem = 1460 KiB, score = 10
测试数据 #8: Accepted, time = 15 ms, mem = 1464 KiB, score = 10
测试数据 #9: Accepted, time = 15 ms, mem = 1472 KiB, score = 10
Accepted, time = 84 ms, mem = 1472 KiB, score = 100
代码
#include <iostream>
#include <cstdio>
#include <math.h>
#include <string.h>
#include <string>
using namespace std;
bool used[5];
int a[5];
bool mem[1000];
double qiku[120][1001];
int ans;
void work(double now,int k)
{
if(k==5){
if(now==24)ans=1;
return;
}
int tot=0;
if(k==3){
for(int i=1;i<=4;i++){
if(used[i]==true)tot+=1<<(i-1);
}
int s=++qiku[tot][0];
qiku[tot][s]=now;
}if(ans==1)return;
for(int i=1;i<=4;i++){
if(used[i])continue;
used[i]=true;
work(now+a[i],k+1);
work(now-a[i],k+1);
work(a[i]-now,k+1);
work(now*a[i],k+1);
if(now!=0)
work(a[i]/now,k+1);
if(a[i]!=0)
work(now/a[i],k+1);
used[i]=false;
}
}
int main()
{
string s;
for(int i=1;i<=4;i++)
{
cin>>s;
if(s=="10")
{a[i]=10;continue;}
if(s[0]=='A') a[i]=1;
if(s[0]<'A') a[i]=s[0]-'0';
if(s[0]=='J') a[i]=11;
if(s[0]=='Q') a[i]=12;
if(s[0]=='K') a[i]=13;
}
ans=0;
memset(used,0,sizeof(used));
memset(qiku,0,sizeof(0));
for(int i=1;i<=4;i++)
{
used[i]=true;
work(a[i],2);
work(-a[i],2);
used[i]=false;
}
if(!ans)
for(int i=1;i<=1;i+=2)
for(int j=2;j<=4;j+=2){
int tot=(1<<(i-1))+(1<<(j-1));
int b=15-tot;
for(int k=1;k<=qiku[tot][0];k++)
{
double x=qiku[tot][k];
for(int l=1;l<=qiku[b][0];l++)
{
double y=qiku[b][l];
if(x+y==24||x-y==24||y-x==24||x*y==24)ans=1;
if(x!=0&&(double)y/x==24||y!=0&&(double)x/y==24)ans=1;
}
}
}
if(ans)
printf("1\n");
else printf("0\n");
}###然而用我的程序处理超多组数据的24点问题还是超时了(QAQ)
-
2014-04-02 09:38:46@
4
[ Σ cos(!ai) ]!=24 (手动斜眼)i=1
-
2014-03-20 11:54:24@
??
-
2014-03-19 20:55:09@
好像是这样
-
2014-03-18 18:32:35@
数据若
-
2014-03-09 16:08:03@
数据弱…………
-
2014-01-22 12:01:45@
数据弱无误……
-
2014-01-22 08:55:09@
-
2014-01-22 07:33:08@
那可未必,3 Q Q Q貌似用枚举跑出来是0.
实际上(3-Q/Q)*Q=24。 -
2014-01-20 17:51:09@
这是因为你的程序是不正确的,然后碰巧过了而已
-
2014-01-20 17:36:51@
应该是数据弱吧……其他有AC代码跑出1的……直接暴力枚举应该能过吧……貌似操作数才4! 乘 4^3=24 乘 64而已吧……
-
2014-01-20 16:21:07@
orz好像没问题
-
2014-01-20 16:11:40@
Orz不怕超时的人
-
2014-01-20 15:21:46@
这题果断全排列,在用枚举
- 1