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 ", (long long)( 1ll * ceil( 1.0 * n / a ) * ceil( 1.0 * m / a ) ) ); 8 }
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 "); 12 return 0; 13 } 14 } 15 printf("NO "); 16 return 0; 17 }
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 ", res); 17 }
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 ", dfs(0)-1); 28 }
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 "); 37 else 38 printf("Ciel "); 39 break; 40 } 41 } 42 43 return 0; 44 }
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 "); 30 else 31 printf("NO "); 32 return 0; 33 }
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 ",num); 25 if(pos==vi[num]){ 26 printf("Waste "); 27 continue; 28 } 29 pos-=num; 30 pos=pos%3; 31 if(pos==1) 32 printf("Carrots "); 33 else if(pos==2) 34 printf("Kiwis "); 35 else if(pos==0) 36 printf("Grapes "); 37 } 38 return 0; 39 }
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 "); 47 } 48 else 49 printf("%d ",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 }
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 }
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(" "); 25 return 0; 26 }