TakeoffYoung

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

A:

  多少a*a的正方形能够覆盖m*n的矩形。

  长用多少覆盖,宽用多少覆盖,向上取整乘起来。注意爆int

1 #include <bits/stdc++.h>
2 
3 int main()
4 {
5     int n, m, a;
6     scanf("%d%d%d", &n, &m, &a);
7     printf("%lld\n", (long long)( 1ll * ceil( 1.0 * n / a ) * ceil( 1.0 * m / a ) ) );
8 }
View Code

 

 

B:

  1000以内只含有4,7的数组放到一个数组里面,对n,遍历数组,看有没有能整除n的。

 1 #include <bits/stdc++.h>
 2 
 3 int fac[] = {4, 7, 44, 47, 74, 77, 444, 447, 474, 477, 744, 747, 774, 777};
 4 
 5 int main()
 6 {
 7     int n;
 8     std::cin >> n;
 9     for (int i : fac) {
10         if (n % i == 0) {
11             printf("YES\n");
12             return 0;
13         }
14     }
15     printf("NO\n");
16     return 0;
17 }
View Code

 

C:

  火车n站,每站下车a人,上车b人,求火车最少能装多少人

  初始为0,每站先下后上,每一站统计一下车上有多少人,维护一个最大值就是答案。

 1 #include <bits/stdc++.h>
 2 
 3 
 4 int main()
 5 {
 6     int n;
 7     std::cin >> n;
 8     int res = 0, tmp = 0;
 9     for (int i= 1; i <= n; ++i) {
10         int a, b;
11         scanf("%d%d", &a, &b);
12         tmp -= a;
13         tmp += b;
14         res = std::max(res, tmp);
15     }
16     printf("%d\n", res);
17 }
View Code

 

D:

  每个人的领导关系是一个树形结构。可能有多个人没有领导。建立一个虚拟的领导(0号employee)是这些没有领导的人的领导。

  从0开始dfs一遍树形结构,树的最大深度-1就是答案(减去一是因为减去虚拟的领导)。

 1 #include <bits/stdc++.h>
 2 
 3 std::vector<int> ve[2222];
 4 
 5 int dfs(int u)
 6 {
 7     int tmp = 0;
 8     for (int i = 0; i < (int)ve[u]. size(); ++i) {
 9         int v = ve[u][i];
10         tmp = std::max(tmp, dfs(v));
11     }
12     return tmp + 1;
13 }
14 
15 int main()
16 {
17     int n;
18     std::cin >> n;
19     for (int i= 1; i <= n; ++i) {
20         int p;
21         std::cin >> p;
22         if (p == - 1)
23             ve[0].push_back(i);
24         else
25             ve[p].push_back(i);
26     }
27     printf("%d\n", dfs(0)-1);
28 }
View Code

 

 

E:

  简单模拟。每个人可能拿的方法为2*100+2*20,1*100+12*20,22*20;第一个人尽量多拿100的,第二个人尽量多拿10的;

  设每人拿K个100的,则拿22-10*K个10的,第一个人拿时K从2枚举到0,满足X>K&&Y>22-10*K则X=X-K,Y=Y-22*K;第二个人拿时从K=0枚举到K=2,然后同理。

  若一个人枚举K时每种都不满足条件,他就输了。

 1 #include <bits/stdc++.h>
 2 
 3 using namespace std;
 4 
 5 int main()
 6 {
 7     int x,y;
 8     scanf("%d %d",&x,&y);
 9     for(int tt=1;1;tt=1-tt)
10     {
11         int k;
12         if(tt)
13         {
14             if(x>=2)
15                 k=2;
16             else if(x==1)
17                 k=1;
18             else
19                 k=0;
20             x-=k;
21             y-=(22-k*10);
22         }
23         else
24         {
25             if(y>=22)
26                 k=0;
27             else if(y>=12)
28                 k=1;
29             else k=2;
30             x-=k;
31             y-=22-10*k;
32         }
33         if(x<0||y<0)
34         {
35             if(tt)
36                 printf("Hanako\n");
37             else
38                 printf("Ciel\n");
39             break;
40         }
41     }
42 
43     return 0;
44 }
View Code

 

 

F:

  判断给定两个数是不是相邻的质数即可。

 1 #include <bits/stdc++.h>
 2 
 3 using namespace std;
 4 
 5 bool judge(int n)
 6 {
 7     for(int i=2;i<n;i++)
 8         if(n%i==0)
 9         return false;
10     return true;
11 }
12 
13 int main()
14 {
15     int x,y;
16     scanf("%d %d",&x,&y);
17     int num=0;
18     if(judge(x))
19         num++;
20     if(judge(y))
21         num++;
22     if(num==2)
23     {
24         for(int i=x+1;i<y;i++)
25             if(judge(i))
26                 num++;
27     }
28     if(num==2)
29         printf("YES\n");
30     else
31         printf("NO\n");
32     return 0;
33 }
View Code

 

G:

  共N行,M列,则第X行,Y列的序号为(X-1)*M+Y;所查询的位置之前,每有一个Waste区域,序号-1,然后对3取模即可。

 1 #include <bits/stdc++.h>
 2 
 3 using namespace std;
 4 
 5 int vi[12345];
 6 
 7 int main()
 8 {
 9     int n,m,k,t;
10     scanf("%d %d %d %d",&n,&m,&k,&t);
11     for(int i=0;i<k;i++)
12     {
13         int a,b;
14         scanf("%d %d",&a,&b);
15         vi[i]=(a-1)*m+b;
16     }
17     sort(vi,vi+k);
18     for(int i=0;i<t;i++)
19     {
20         int a,b;
21         scanf("%d %d",&a,&b);
22         int pos=(a-1)*m+b;
23         int num=lower_bound(vi,vi+k,pos)-vi;
24         //printf("num=%d\n",num);
25         if(pos==vi[num]){
26             printf("Waste\n");
27             continue;
28         }
29         pos-=num;
30         pos=pos%3;
31         if(pos==1)
32             printf("Carrots\n");
33         else if(pos==2)
34             printf("Kiwis\n");
35         else if(pos==0)
36             printf("Grapes\n");
37     }
38     return 0;
39 }
View Code

 

H:

  求两个数在给定区间上的公约数,没有输出-1;两个数的最大公约数的约数一定是这两个数的公约数,求出最大公约数(GCD)后枚举判断是否是GCD的约数,然后按照区间查询即可。

 1 #include <cstdio>
 2 #include <iostream>
 3 #include <algorithm>
 4 
 5 using namespace std;
 6 
 7 const int M = 1e6;
 8 int ma[M];
 9 
10 int gcd(int a,int b);
11 
12 int main()
13 {
14     int a,b,n;
15     int ans,to;
16     int i;
17     int ua,ub;
18     int tp;
19     while(~scanf("%d %d",&a,&b))
20     {
21         scanf("%d",&n);
22         ans = gcd(a,b);
23         to = 0;
24         for(i= 1; i*i <= ans; i++)
25         {
26             if(ans % i == 0)
27             {
28                 ma[to++] = i;
29                 if(i *i != ans)
30                 {
31                     ma[to++] = ans / i;
32                 }
33             }
34         }
35         sort(ma,ma + to);
36         while(n--)
37         {
38             scanf("%d %d",&ua,&ub);
39             tp = lower_bound(ma, ma + to, ub) - ma;
40             if(ma[tp] > ub || tp == to)
41             {
42                 tp--;
43             }
44             if(ma[tp] < ua || ma[tp] > ub)
45             {
46                 printf("-1\n");
47             }
48             else
49                 printf("%d\n",ma[tp]);
50 
51         }
52     }
53 return 0;
54 }
55 
56 
57 int gcd(int a,int b)
58 {
59     return b==0 ? a : gcd(b, a % b);
60 }
View Code

 

I :

  给两个数,判断去掉所有0后加法是否正确。先算出原来两个数的和C,再把两个数的0都去掉,求和为D,判断C去掉0后是否与D相等。

 1 #include <bits/stdc++.h>
 2 
 3 int fun(int x)
 4 {
 5     int res = 0, tmp = 1;
 6     while (x) {
 7         if (x%10) {
 8             res += (x % 10 * tmp);
 9             tmp *= 10;
10         }
11         x /= 10;
12     }
13     return res;
14 }
15 
16 int main()
17 {
18     int a, b;
19     scanf("%d%d", &a, &b);
20     puts(fun(a) + fun(b) == fun(a+b) ? "YES" : "NO");
21 }
View Code

 

J:

  简单模拟。

 1 #include <bits/stdc++.h>
 2 
 3 using namespace std;
 4 
 5 int main()
 6 {
 7     int n,p,k;
 8     scanf("%d %d %d",&n,&p,&k);
 9     int x=p-k;
10     int y=p+k;
11     if(x>1)
12         printf("<<");
13     int i;
14     for(i=max(x,1);i<=n&&i<=y;i++)
15     {
16         if(i>0)
17             printf(" ");
18         if(i==p)
19             printf("(%d)",i);
20         else printf("%d",i);
21     }
22     if(y<n)
23         printf(" >>");
24     printf("\n");
25     return 0;
26 }
View Code

 

posted on 2015-11-07 23:05  TakeoffYoung  阅读(245)  评论(0编辑  收藏  举报