作者kc655039 (NNN  )
看板ACMCLUB
标题Re: [问题] 我想问一个问题10364
时间Sun Sep 5 00:39:46 2004
我是TLE
然後我是先找一个边
再继续找下一个
找到三个就输出yes
停止并且输入no的条件是 退後到第一个边找不到
贴一下code好了 不过太长了应该很难有人想看
我想请教的事情是
我写的程式都很慢
我不知道怎麽样才能快
有一题叫做f91的那一题10696吧如果我记得没错的话我连那提都比别人慢
还有就是我10299也是TLE但是10179过了我也觉得我方法对了而且我想了很久才想出来的
但是还是不行
我想进步所以想请教你们我该怎麽做
我的程式背景是学了大一上下学期的程式语言课
然後经过同学介绍acm然後就开始写题目
但我以前没算过什麽数学所以有的题目是想的很痛苦之後才想出来的
大概就是这样建议一下我该看什麽书该怎麽做
目前计画是写名题一百然後学学离散数学这样...
不好意思打扰你们了...
#include <iostream>
using std::cout;
using std::cin;
using std::endl;
void swap(int &a,int &b)
{
int c;
c=a;
a=b;
b=c;
}
void bbsort(int *p,int n)
{
int i,j;
for (i=n-1;i>0;i--)
for (j=1;j<=i;j++)
if (p[j-1]<p[j])
swap(p[j-1],p[j]);
}
int sum(int *p,int n)
{
int i;
int summation=0;
for (i=0;i<n;i++)
summation+=p[i];
return summation;
}
bool judge(int *p,int n,int length)
{
int i;
for (i=0;i<n;i++)
if (p[i]>length) return 1;
return 0;
}
void initial(int *q,int n)
{
int i;
for (i=0;i<n;i++) q[i]=0;
}
char *solve(int *p,int n)
{
int length;
int total=1;
int position[3]={0,0,0};
int *q;
int pointer=0;
int i,j;
int temp;
int summation;
if (sum(p,n)%4) return "no";
length=sum(p,n)/4;
if (judge(p,n,length)) return "no";
bbsort(p,n);
q=new int[n];
initial(q,n);
for (i=0;i<n;i++)
if (p[i]==length) q[i]=total,position[pointer]++,total++;
if (p[position[pointer]]+p[n-1]>length) return "no";
summation=0;
summation+=p[position[pointer]];
q[position[pointer]]=total;
temp=position[pointer];
i=position[pointer]+1;
while (total<4)
{
for (;i<n;i++)
{
if (q[i]==0 && p[i]<=length-summation) q[i]=total,summation+=p[i],temp=i;
if (summation==length)
{
summation=0;
for (j=0;j<n;j++)
if (q[j]==0)
{
position[++pointer]=j;
q[j]=++total;
break;
}
summation+=p[j];
for (j=position[pointer]+1;j<n;j++)
if (q[j]==0)
{
i=temp=j;
break;
}
break;
}
}
if (i>=n)
{
if (pointer==0) return "no";
if (temp==position[pointer])
{
q[position[pointer]]=0;
pointer--;
total--;
summation=length;
for (j=n-1;j>=0;j--)
if (q[j]==total)
{
q[j]=0;
summation-=p[j];
break;
}
for (;j>=0;j--)
if (q[j]==total)
{
q[j]=0;
temp=j;
i=j;
summation-=p[j];
break;
}
}
else
{
q[temp]=0;
for (j=temp+1;j<n;j++)
if (q[j]==0)
{
summation-=p[temp];
i=j;
temp=j;
break;
}
}
}
}
return "yes";
}
main()
{
int *p;
int n;
int N;
int i;
cin>>N;
while (N>0)
{
cin>>n;
p=new int[n];
for (i=0;i<n;i++) cin>>p[i];
cout<<solve(p,n)<<endl;
delete [] p;
N--;
}
return 0;
}
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 218.161.11.9