8-15-Exercise

8-15-小练

这次的题目......只觉得泪奔啊......T T

A.HDU 1042   N!

因为0<=n<=1000,故一定要用数组或字符串【同样因为n<=1000故用数组就够了~~~】。

代码:

 1 #include <iostream>
 2 #include <cstdio>
 3 using namespace std;
 4 
 5 int a[40000];
 6 
 7 int main()
 8 {
 9     int n,i,j;
10     while(~scanf("%d",&n))
11     {
12         if(n==1 || n==0){printf("1\n"); continue;}
13         a[0]=1;            //用来记录数字的位数
14         a[1]=1;
15         for(i=2;i<=n;i++)
16         {
17             int sum=0;
18             for(j=1;j<=a[0];j++)
19             {
20                 int temp=a[j]*i+sum;
21                 sum=temp/10;
22                 a[j]=temp%10;
23             }
24             while(sum)
25             {
26                 a[j]=sum%10;
27                 a[0]=j;
28                 sum/=10;
29                 j++;
30             }
31         }
32         for(i=a[0];i>=1;i--)
33             printf("%d",a[i]);
34         printf("\n");
35     }
36     return 0;
37 }

//memory:372KB     time:1546ms

B.HDU 1050      Moving Tables

下面是网上的代码,我做这道题时,自己的思路与下面代码的思路略有不同......我是把区间从大到小排了后再找同一时间能作业的区间,看要找几次;而网上的代码的思路则是找重叠区域,看重叠的次数。其实,实质上,我的“找的次数”与网上的“重叠次数”都是相同的,但不知道为什么WA,但测试了好几组数据都是对的......

我的代码如下【还望高手不吝赐教】:

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <algorithm>
 4 #include <cstring>
 5 using namespace std;
 6 
 7 class N
 8 {
 9 public:
10     int x,y,id;
11 }a[1000];
12 
13 bool comp(N w,N q)
14 {
15     return w.x<q.x;
16 }
17 
18 int main()
19 {
20     int t,n,i,j;
21     scanf("%d",&t);
22     while(t--)
23     {
24         memset(a,0,sizeof(a));
25         scanf("%d",&n);
26         for(i=0;i<n;i++)
27         {
28             int x,y;
29             scanf("%d%d",&x,&y);
30             if(x<y)
31                 {a[i].x=x;a[i].y=y;}
32             else
33                 {a[i].x=y;a[i].y=x;}
34         }
35         sort(a,a+n,comp);
36         int sum=0;
37         for(i=0;i<n;i++)
38             if(a[i].id==0)
39             {
40                 a[i].id=1;
41                 int minn=a[i].y;
42                 for(j=i+1;j<n;j++)
43                     if(a[j].id==0 && a[j].x>minn)
44                     {
45                         a[j].id=1;
46                         minn=a[j].y;
47                     }
48                 sum++;
49             }
50         printf("%d\n",sum*10);
51     }
52     return 0;
53 }

网上的AC代码:

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

#define maxn 460

int main()
{
    int t,i,n,b,e;
    scanf("%d",&t);
    while (t--)
    {
        int c[200]={0},m=0;
        scanf("%d",&n);
        while (n--)
        {
            scanf("%d%d",&b,&e);
            if (b>e)
            {
                i=b;
                b=e;
                e=i;
            }
            for (i=(b-1)/2;i<=(e-1)/2;++i)
                ++c[i];
        }
        for (i=0;i<200;++i)
            if (m<c[i])m=c[i];
        printf("%d\n",10*m);
    }
    return 0;
}

//memory:228KB   time:0ms

C.HDU 1181     变形课

题意:就是在一堆的字符串中看“b”是否能转换成“m”。【转换关系:每一个字符串的首字母可以变为尾字母】

 BFS~

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <queue>
 4 #include <cstring>
 5 using namespace std;
 6 
 7 const int inf=1<<30;
 8 bool vis[11111];
 9 int a[55][55];
10 char c[11111];
11 
12 void bfs()
13 {
14     int q1=1,q2,i;
15     queue<int> q;
16     memset(vis,0,sizeof(vis));
17     q.push(q1);
18     vis[q1]=1;
19     while(!q.empty())
20     {
21         q2=q.front();
22         q.pop();
23         for(i=0;i<26;i++)       //i代表的是字母【example:i=0,代表A】
24             if(!vis[i] && a[q2][i]==1)     
25             {
26                 if(i=='m'-'a')
27                 {
28                     puts("Yes.");
29                     return;
30                 }
31                 q.push(i);
32                 vis[i]=1;
33             }
34     }
35     puts("No.");
36     return;
37 }
38 
39 int main()
40 {
41     int t,n,i,j,len;
42     memset(a,0,sizeof(a));
43     while(~scanf("%s",c))
44     {
45         len=strlen(c);
46         a[c[0]-'a'][c[len-1]-'a']=1;          //建立字母转换的图
47         if(c[0]=='0')
48         {
49             bfs();
50             memset(a,0,sizeof(a));
51         }
52     }
53     return 0;
54 }

//memory:268KB     time:0ms

D.HDU 3501      Calculation 2

是考欧拉函数~

来源:http://gzhu-101majia.iteye.com/blog/1296950

代码:

 1 #include <iostream>
 2 #include <cstdio>
 3 using namespace std;
 4 
 5 #define M 1000000007
 6 
 7 int eular(__int64 n)     //欧拉函数
 8 {
 9     int i,ans=n;
10     for(i=2;i*i<=n;i++)
11         if(n%i==0)
12         {
13             ans-=ans/i;
14             while(n%i==0)
15                 n/=i;
16         }
17     if(n>1) ans-=ans/n;
18     return ans;
19 }
20 
21 int main()
22 {
23     __int64 n,ans;
24     while(scanf("%I64d",&n),n)
25     {
26         ans=n*(n+1)/2-n;
27         ans-=eular(n)*n/2;
28         ans%=M;
29         printf("%I64d\n",ans);
30     }
31     return 0;
32 }

//memory:228KB    time:15ms

E.HDU 2601       An easy problem

i*i+i+j=n可以写成:(i+1)*(j+1)=n-1

式子改成了上面这个模样......答案就华华丽丽的出来了~~╮(╯▽╰)╭

代码:

 1 #include<stdio.h>
 2 #include<math.h>
 3 int main()
 4 {
 5 
 6     int t;
 7     scanf("%d",&t);
 8     while(t--)
 9     {
10         __int64 n;
11         scanf("%I64d",&n);
12         n++;
13        __int64 i;
14         __int64 sum=0;
15         for(i=2;i*i<=n;i++)
16             if(n%i==0)
17             sum++;
18          printf("%I64d\n",sum);
19 
20     }
21     return 0;
22 }

//memory:228KB   time:2000ms

 

posted @ 2013-08-16 23:37  Teilwall  阅读(278)  评论(4编辑  收藏  举报