分类: C/C++
2014-07-22 11:08:03
A - 万圣节派对
Time Limit:1000MS Memory Limit:65535KB 64bit IO Format:%I64d & %I64u
Description
万圣节有一个Party,XadillaX显然也要去凑热闹了。因为去凑热闹的人数非常庞大,几十W的数量级吧,自然要进场就需要有门票了。很幸运的,XadillaX竟然拿到了一张真·门票!这真·门票的排列规则有些奇怪:
门票号是由0~6组成的六位数(0~6这几个数字可重用)
每一个门票号的每一位不能有三个连续相同的数字(如123335是不行的)
每一个门票号相邻的两位相差必须在四以下(≤4)(如016245是不行的)
Input
第一行一个n,代表数据组数
接下去n行,每行两个数字x,y(x <= y)
Output
对于每一组数据,输出x到y之间的门票编号
Sample Input
2
001001 001002
001011 001012
Sample Output
001001
001002
001011
001012
第一次的代码如下,结果是时间超限
#include
#include
using namespace std;
int really(int x) //测试x是否满足条件
{
int i;
int a[6]; //将x拆分成6个单独的数
for(i=5;i>=0;i--)
{
a[i]=x%10;
x/=10;
if(a[i]>6)
return 0;
}
for(i=0;i<5;i++)
{
if(i<4)
{
if(a[i]==a[i+1]&&a[i]==a[i+2])
return 0;
}
if(i<5)
{
if(a[i]-a[i+1]>4||a[i]-a[i+1]<-4)
return 0;
}
}
return 1;
}
int main()
{
int n,i,j,x,y,t;
while(scanf("%d",&n)!=EOF)
{
while(n--)
{
int a[6];
cin>>x>>y;
for(i=x;i<=y;i++)
{
if(really(i)==1)
{
t=i;
for(j=5;j>=0;j--)
{
a[j]=t%10; t/=10;
}
for(j=0;j<6;j++)
{
cout<<a[j];
}
cout<<endl;
}
}
cout<<endl;
}
}
return 0;
}
比较合理的解释:默认情况,cin与stdin总是保持同步的,也就是说这两种方法可以混用,而不必担心文件指针混乱,同时cout和stdout也一样,两者混用不会输 出顺序错乱。正因为这个兼容性的特性,导致cin有许多额外的开销,如何禁用这个特性呢?只需一个语句 std::ios::sync_with_stdio(false);,这样就可以取消cin于stdin的同步了,此时的cin就与scanf差不多 了。
另一种解释: cout在输出时总是要先将输出的存入缓存区。而printf直接调用系统进行IO,它是非缓存的。所以cout比printf慢。
stdin(Standardinput)标准输入