Brian Warehouse

Some birds aren`t meant to be caged, their feathers are just too bright... ...
posts - 40, comments - 16, trackbacks - 0, articles - 1

2010年8月19日

f(n) 是正整数n 的各位数字之和。如果 f(n) 是1位数那么n的数根就是f(n),否则f(n) 的数根就是n 的数根。举例说明:987的数根是6 (9+8+7=24 2+4=6)。你的任务是找出这样表达式的数根: A1*A2*…*AN + A1*A2*…*AN-1 + … + A1*A2 + A1。

输入包含K个测试样例。输入第一行会给出 K (1<=K<=5)。每个测试样例占一行。这一行的第一个数是一个正整数N (N<=1000)。 接着是N个非负整数 (序列 A)。 均不超过109

数根(百度知道): http://zhidao.baidu.com/question/29789035.html
对于求余数的问题是我一开始就忽略了的地方,后来看了HPF的博客,才知道有这样的技巧:
   (A+B)mod C = (A mod C) + (B mod C)
   (AB) mod C = (A mod C) × (B mod C)

C编译器 , 0MS  0KB , 如果你把前两句定义变量的语句对调,将会耗费 20MS 的时间
#include <stdio.h>
int main() 
{
    
int i=0,j,K,N,temp,m;
    
long int A;
    scanf(
"%d",&K);
    
for (; i<K; i++) {
        scanf(
"%d",&N);
        m
=1;
        A
=0;
        
for (j=0; j<N; j++) {
            scanf(
"%d",&temp);
            temp
%=9;
            m
=(m*temp)%9;
            A
=(A+m)%9;
        }
        printf(
"%d\n",(A+8)%9+1);
    }
    
return 0;
}

posted @ 2010-08-19 15:35 Brian 阅读(272) | 评论 (0)编辑 收藏

下面的代码没有AC,没有AC的原因是 PE on test 8, 注意,是第八组。我难以理解,希望大牛们指教

#include <iostream>
#include 
<stdio.h>
using namespace std;

int main()
{
    __int64 x,left,right,mid;
    scanf(
"%I64d",&x); 
    left
=0;
    right
=x+1;
    
while ((left+1)<right) // 二分查找
    {
        mid
=(left+right)/2;
        
if(mid*mid<=x)
          left
=mid;
        
else
          right
=mid;
    }
    printf(
"%I64d",left);
    
return 0;
}

posted @ 2010-08-19 14:36 Brian 阅读(681) | 评论 (3)编辑 收藏

posted @ 2010-08-19 00:23 Brian 阅读(231) | 评论 (0)编辑 收藏

2010年8月18日

唉,半年没有切题的后果就是这道水题写了整整3个小时。。。

题目的要求是输入若干组颜色数据,前16组是目标组,后面剩下的都是用来尝试与其映射的,用后面与前面的一次匹配,各循环16次,各自最小的D的相应映射组就是我们要的结果。

C++ 编译器 ,220K  0MS
#include<iostream>
#include
<climits> // 为第一组数据运算做的约束
using namespace std;  
int RGB[16][3],in[3],out[3]; // in 用来接收数据, out 用来暂存映射正确的数据

int main(){ 
    
for (int i=0; i<16; i++// 输入的数据中前16组是 target set
        cin>>RGB[i][0]>>RGB[i][1]>>RGB[i][2]; 
    
while (1) { 
        cin
>>in[0]>>in[1]>>in[2]; // 开始接收映射组
        if (in[0== -1break;
        
int MIN=INT_MAX; // 2147483647
        for (int i=0; i<16; i++) { 
            
int sum=(RGB[i][0]-in[0])*(RGB[i][0]-in[0])+
                (RGB[i][
1]-in[1])*(RGB[i][1]-in[1])+
                (RGB[i][
2]-in[2])*(RGB[i][2]-in[2]); // 不需要开方,开方易产生误差
            if (sum < MIN) { 
                
out[0]=RGB[i][0]; 
                
out[1]=RGB[i][1]; 
                
out[2]=RGB[i][2]; 
                MIN
=sum; // 最小的即映射成功
            } 
        } 
        cout
<<"("<<in[0]<<","<<in[1]<<","<<in[2]<<") maps to ("
            
<<out[0]<<","<<out[1]<<","<<out[2]<<")"<<endl;  
    }
    
return 0;
}

有一点要说明的是<limits.h>头文件,建议MSDN一下,你会发现很多有用的常量,拿来就能用。

posted @ 2010-08-18 01:00 Brian 阅读(405) | 评论 (0)编辑 收藏

2010年8月17日

我觉得有必要把它翻译一下,然后就会发现考得其实是数学,你在google 翻译上是得不到如下翻译的:
Description
考虑下面的交流电路。我们将假定电路在稳态。因此,节点1的电压和节点2的电压分别是v1 = VS coswt 和 v2 = VRcos (wt + q),其中Vs是电源电压,w是频率(弧度每秒),t是时间。VR是电阻R两端电压下降的幅度,q是它的相位。
POJ 1045 Bode Plot - Icho - Brian Warehouse
你需要写一个程序,以确定不同的w对应的VR值。您将需要两个电学定律来解决这个问题。第一
个是是欧姆定律,表述为V2 = iR,其中i是在电路顺时针流向的电流大小。
第二个是i = C d/dt (v1-v2),i与电容器两板上的电压有关。"d/dt" 意为求关于t的求导。
Input
输入包括一行或多行。第一行包括三个实数和一个非负整数。实数按顺序是VS,R,C。
整数n是测试用例的个数。接下来的n行就是输入,要求一行一个实数,代表w的值。

Output
输出n行的VR值,注意,结果精确到小数点后三位。
下面需要推导一下求VR的公式:
V2=iR=CR d/dt (VS*cos(wt)-VR*cos(wt+q))=VRcos(wt+q)
         = CR w (sin(wt+q)-sin(wt))=VRcos(wt+q)
下面用到高中数学当中的计算方法,分别令 t=0 和 wt+q=0 ,得到 CRw  tan b = 1 和 VR=CRw VS sin b ,
然后利用三角函数中的万能公式,求得 :VR = CRw VS / sqrt (1+ (CRw) ^ 2 ))

POJ 1045 Bode Plot - Icho - Brian Warehouse// C 编译器:
POJ 1045 Bode Plot - Icho - Brian Warehouse
#include <stdio.h>
POJ 1045 Bode Plot - Icho - Brian Warehouse#include 
<math.h>
POJ 1045 Bode Plot - Icho - Brian Warehouse
int main()
POJ 1045 Bode Plot - Icho - Brian WarehousePOJ 1045 Bode Plot - Icho - Brian Warehouse
POJ 1045 Bode Plot - Icho - Brian Warehouse{
POJ 1045 Bode Plot - Icho - Brian Warehouse    
int i=0,n;
POJ 1045 Bode Plot - Icho - Brian Warehouse    
double VR,VS,R,C,w;
POJ 1045 Bode Plot - Icho - Brian Warehouse    scanf(
"%lf%lf%lf%d",&VS,&R,&C,&n);    
POJ 1045 Bode Plot - Icho - Brian Warehouse    
POJ 1045 Bode Plot - Icho - Brian Warehouse    
for (; i<n; i++)
POJ 1045 Bode Plot - Icho - Brian WarehousePOJ 1045 Bode Plot - Icho - Brian Warehouse    
POJ 1045 Bode Plot - Icho - Brian Warehouse{
POJ 1045 Bode Plot - Icho - Brian Warehouse        scanf(
"%lf",&w);
POJ 1045 Bode Plot - Icho - Brian Warehouse        VR
=C*R*w*VS / sqrt(1+C*C*R*R*w*w);
POJ 1045 Bode Plot - Icho - Brian Warehouse        printf(
"%.3lf\n",VR);
POJ 1045 Bode Plot - Icho - Brian Warehouse    }

POJ 1045 Bode Plot - Icho - Brian Warehouse    
return 0;
POJ 1045 Bode Plot - Icho - Brian Warehouse}

注意 , 用 double 

posted @ 2010-08-17 14:49 Brian 阅读(926) | 评论 (0)编辑 收藏

#include <iostream>
#include 
<string>
using namespace std;

int main()
{
    
int a[200],b[200],c[400]={0},i,j,ls1,ls2;
    
string s;
    
    
for (cin>>s,ls1=s.length(),i=ls1-1,j=0; i>=0; i--)
        a[j
++]=s[i]-'0'//将第一个数逆序放入a数组
    
    
for (cin>>s,ls2=s.length(),i=ls2-1,j=0; i>=0; i--)
        b[j
++]=s[i]-'0'//将第二个数逆序放入b数组

    
for (i=0; i<ls1; i++)
        
for (j=0; j<ls2; j++)
        {
            c[i
+j] += a[i]*b[j];
            
if(c[i+j] >= 10)
            {
                c[i
+j+1+= c[i+j]/10;
                c[i
+j] %= 10;
            }
        }
    
    i
=399;
    
while (i--)
        
if (c[i]) break//跳过所有前导0
    for (; i>=0; i--)
        printf(
"%d",c[i]); //输出主体部分
    return 0;
}

posted @ 2010-08-17 14:24 Brian 阅读(406) | 评论 (0)编辑 收藏

#include <iostream>
#include 
<string>
using namespace std;
int main()
{
    
int a[201]={0},b[200]={0},i,j,len,ls1,ls2,f=0// 相加后结果放在a内
    string s;
    
    
for (cin>>s,ls1=s.length(),i=ls1-1,j=0; i>=0; i--)
        a[j
++]=s[i]-'0'//将第一个数逆序放入a数组
    
    
for (cin>>s,ls2=s.length(),i=ls2-1,j=0; i>=0; i--)
        b[j
++]=s[i]-'0'//将第二个数逆序放入b数组

    
for (i=0,len=ls1>ls2?ls1:ls2; i<len; i++// 注意len取二者较大的值
    {
        a[i] 
+= b[i]; //相加结果放入a数组
        if (a[i] >= 10)
        {
            a[i] 
%= 10//进位处理
            a[i+1]++;
        }
    }
    
    
if (a[len]) printf("%d",a[len]); //所谓的前导0
    for (i=len-1; i>=0; i--)
        printf(
"%d",a[i]); //输出主体部分
    return 0;
}

posted @ 2010-08-17 14:21 Brian 阅读(309) | 评论 (0)编辑 收藏

题目描述
某校大门外长度为L的马路上有一排树,每两棵相邻的树之间的间隔都是1米。我们可以把马路看成一个数轴,马路的一端在数轴0的位置,另一端在L的位置;数轴上的每个整数点,即0,1,2,……,L,都种有一棵树。
马路上有一些区域要用来建地铁,这些区域用它们在数轴上的起始点和终止点表示。已知任一区域的起始点和终止点的坐标都是整数,区域之间可能有重合的部分。现在要把这些区域中的树(包括区域端点处的两棵树)移走。你的任务是计算将这些树都移走后,马路上还有多少棵树。
输入
输入的第一行有两个整数L(1 <= L <= 10000)和 M(1 <= M <= 100),L代表马路的长度,M代表区域的数目,L和M之间用一个空格隔开。接下来的M行每行包含两个不同的整数,用一个空格隔开,表示一个区域的起始点和终止点的坐标。
输出
输出包括一行,这一行只包含一个整数,表示马路上剩余的树的数目。
样例输入
500 3
150 300
100 200
470 471
样例输出
298
基本思路:将所有的树做标记,移走则标记为0,存在标记为1.由于不好判断给定数目是多少,故用向量。效率虽然不高,但是可以AC。
#include <iostream>
#include 
<vector>
using namespace std;

int main()
{
    
int L,M,i=0,j,start,end,count=0;
    scanf(
"%d%d",&L,&M);
    vector
<int> Mark(L+1,1);
    
    
for (; i<M; i++
    {
        scanf(
"%d%d",&start,&end);
        
for (j=start; j<=end; j++)
            Mark[j]
=0;
    }
    
for (i=0; i<=L; i++)
        
if (Mark[i]==1)
            count
++;
    printf(
"%d\n",count);
    
return 0;
}
 

posted @ 2010-08-17 14:19 Brian 阅读(604) | 评论 (0)编辑 收藏

Description

输入一个2进制的数,要求输出该2进制数的16进制表示。
在16进制的表示中,A-F表示10-15

Input

第1行是测试数据的组数n,后面跟着n行输入。每组测试数据占1行,包括一个以0和1组成的字符串,字符串长度至少是1,至多是10000

Output

n行,每行输出对应一个输入。

Sample Input

2
100000
111

 

 

 

Sample Output

20
7


09小孩问我的一道题,原来写的代码足足有90多行,今天重写:
 
#include <iostream>
#include 
<string>
using namespace std;

int main()
{
    
int n,pos,sec,i,j,w[4= {1,2,4,8}; //sec是分段处理,pos是对应权值位置
    char x[17= "0123456789ABCDEF"//打表        
    string bin; //输入的二进制字符串
    cin>>n;
    
while (n--)
    {
        cin
>>bin;
        sec
=bin.length()%4;
        pos
=0;
        
for (i=sec; i>0; i--)
            
if (bin[sec-i]=='1')
                pos 
+= w[i-1];
        
if (sec) printf("%c",x[pos]);
        
for (i=sec; i<bin.length(); i+=4)
        {
            pos
=0;
            
for (j=0; j<4; j++)
                
if (bin[i+j]=='1')
                    pos 
+= w[3-j];
            printf(
"%c",x[pos]);
        }
        printf(
"\n");
    }
    
return 0;
}

posted @ 2010-08-17 14:18 Brian 阅读(295) | 评论 (0)编辑 收藏

Description

你的一个朋友买了一台电脑。他以前只用过计算器,因为电脑的显示器上显示的数字的样子和计算器是不一样,所以当他使用电脑的时候会比较郁闷。为了帮助他,你决定写一个程序把在电脑上的数字显示得像计算器上一样。

Input

输入包括若干行,每行表示一个要显示的数。每行有两个整数s和n (1 <= s <= 10, 0 <= n <= 99999999),这里n是要显示的数,s是要显示的数的尺寸。

如果某行输入包括两个0,表示输入结束。这行不需要处理。

Output

显示的方式是:用s个'-'表示一个水平线段,用s个'|'表示一个垂直线段。这种情况下,每一个数字需要占用s+2列和2s+3行。另外,在两个数字之间要输出一个空白的列。在输出完每一个数之后,输出一个空白的行。注意:输出中空白的地方都要用空格来填充。

Sample Input

2 12345
3 67890
0 0

 

 

Sample Output

      --   --        --
|    |    | |  | |
|    |    | |  | |
--   --   --   --
| |       |    |    |
| |       |    |    |
--   --        --
---   ---   ---   ---   ---
|         | |   | |   | |   |
|         | |   | |   | |   |
|         | |   | |   | |   |
---         ---   ---
|   |     | |   |     | |   |
|   |     | |   |     | |   |
|   |     | |   |     | |   |
---         ---   ---   ---

 

 

Hint

数字(digit)指的是0,或者1,或者2……或者9。
数(number)由一个或者多个数字组成。

这题横跨我一个学期之久,后来无奈还是百度了一下:

#include <iostream>
using namespace std;

char n1[] = "- -- -----";
char n2[] = "|   ||| ||";
char n3[] = "|||||  |||";
char n4[] = "  ----- --";
char n5[] = "| |   | | ";
char n6[] = "|| |||||||";
char n7[] = "- -- -- --";

int main()
{
    
int m;
    
char n[10];
    cin
>>m>>n;
    
while ((n[0]-'0')||m)
    {
        
int len = strlen(n);
        
for (int i=0;i<len;i++)
        {
            cout
<<" ";
            
int num = n[i]-'0';
            
for (int j=0;j<m;j++)
            {
                cout
<<n1[num];
            }
            cout
<<"  ";
        }
        cout
<<endl;
        
int temp = m;
        
while (temp--)
        {
            
for (int i=0;i<len;i++)
            {
                
int num = n[i]-'0';
                cout
<<n2[num];
                
for (int j=0;j<m;j++)
                {
                    cout
<<" ";
                }
                cout
<<n3[num];
                cout
<<" ";
            }
            cout
<<endl;
        }
        
for (int i=0;i<len;i++)
        {
            cout
<<" ";
            
int num = n[i]-'0';
            
for (int j=0;j<m;j++)
            {
                cout
<<n4[num];
            }
            cout
<<"  ";
        }
        cout
<<endl;
        temp 
= m;
        
while (temp--)
        {
            
for (int i=0;i<len;i++)
            {
                
int num = n[i]-'0';
                cout
<<n5[num];
                
for (int j=0;j<m;j++)
                {
                    cout
<<" ";
                }
                cout
<<n6[num];
                cout
<<" ";
            }
            cout
<<endl;
        }
        
for (int i=0;i<len;i++)
        {
            cout
<<" ";
            
int num = n[i]-'0';
            
for (int j=0;j<m;j++)
            {
                cout
<<n7[num];
            }
            cout
<<"  ";
        }
        cout
<<endl<<endl;

        cin
>>m>>n;
    }
    
return 0;
}

 

我想,第一次做出来这题的人真是了不起!

posted @ 2010-08-17 14:17 Brian 阅读(431) | 评论 (0)编辑 收藏