注意 此处比赛分别为Round462, 463, 464, 466,均为Div2
Round462 A 题面 Tommy有n个灯笼,BanBan有m个灯笼,Tommy拿走一个灯笼,分别从Tommy的和BanBan的选择一个灯笼,求最大乘积,假设双方都使用最优决策。
题解 枚举Tommy拿走的灯笼,及Tommy拿走该灯笼后所选的两个灯笼,求max即可
代码 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include <cstdio>
#include <iostream>
#include <queue>
#include <algorithm>
#include <climits>
const int MAXN=50 +5 ;
std ::priority_queue<int >pq,pq2,pq3,pq4;
int n,m,x,a[MAXN],b[MAXN];long long ans=LLONG_MAX,tmp;
int main ()
{
scanf ("%d %d" ,&n,&m);
for (int i=1 ;i<=n;i++)
scanf ("%d" ,&a[i]);
for (int i=1 ;i<=m;i++)
scanf ("%d" ,&b[i]);
for (int i=1 ;i<=n;i++)
{
tmp=LLONG_MIN;
for (int j=1 ;j<=n;j++)
{
if (i==j) continue ;
for (int k=1 ;k<=m;k++)
tmp=std ::max(tmp,(long long )a[j]*b[k]);
}
ans=std ::min(ans,tmp);
}
std ::cout <<ans;
return 0 ;
}
B 题面 题面很玄乎。。其实就是求一个数字的形状中有k个圈的数。。
题解 首先排除k > 36 的数,因为不超过10 1 8 即使圈数最大,也就36个圈 那么时间复杂度也就很小了。 然后输出8(两个圈)直至k < 2 ,然后输出6(一个圈)不住
代码 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <cstdio>
int loop[10 ]={1 ,0 ,0 ,0 ,1 ,0 ,1 ,0 ,2 ,1 },k,r;
int main ()
{
scanf ("%d" ,&k);
if (k>18 *2 ) printf ("-1\n" ); else {
r=k/2 ;
k-=r*2 ;
for (int i=1 ;i<=k;i++)
printf ("6" );
for (int i=1 ;i<=r;i++)
printf ("8" );
}
return 0 ;
}
Round463 A 题面 给出一个字符串S,输出一个新字符串Str,使得S是Str的子串
题解 输出原字符串,再输出字符串的反转串即可 这样,从左往右和从右往左都是先正着再反着读
代码 1
2
3
4
5
6
7
8
9
10
11
12
13
#include <cstdio>
#include <cstring>
const int MAXN=1000 +5 ;
char c[MAXN];int l;
int main ()
{
scanf ("%s" ,c);
l=strlen (c);
printf ("%s" ,c);
for (int i=l-1 ;i>=0 ;i--)
printf ("%c" ,c[i]);
return 0 ;
}
B 题面 给定一个函数,输出x在[ l , r ] 间该函数参数为x,值=k的参数数量
题解 显然函数结果< 9 ,且时间复杂度较低,暴力求出各参数的值,做个二维前缀和即可
代码 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#include <cstdio>
#include <algorithm>
const int MAXN=1000000 +5 ;
const int MAXC=9 +5 ;
int pfx[MAXC][MAXN],pfxr[MAXC][MAXN];
int g (int x)
{
if (x<10 ) return x;
int product=1 ;
while (x)
{
if (x%10 ) product*=x%10 ;
x/=10 ;
}
return g(product);
}
int main ()
{
for (int i=1 ;i<=1000000 ;i++)
{
pfxr[g(i)][i]++;
}
for (int i=1 ;i<=9 ;i++)
for (int j=1 ;j<=1000000 ;j++)
pfx[i][j]=pfx[i][j-1 ]+pfxr[i][j];
int q,l,r,k;
scanf ("%d" ,&q);
for (int i=1 ;i<=q;i++)
{
scanf ("%d %d %d" ,&l,&r,&k);
printf ("%d\n" ,pfx[k][r]-pfx[k][l-1 ]);
}
return 0 ;
}
Round464 A 题面 给出各个人的相爱关系,寻找是否有A爱B,B爱C,C爱A
题解 对于每个i 关系坐标三层嵌套,看是否等于i
代码 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <cstdio>
const int MAXN=10000 +5 ;
int n,list [MAXN];
int main ()
{
scanf ("%d" ,&n);
for (int i=1 ;i<=n;i++)
scanf ("%d" ,&list [i]);
for (int i=1 ;i<=n;i++)
if (list [list [list [i]]]==i)
{
printf ("YES" );
return 0 ;
}
printf ("NO" );
return 0 ;
}
B 题面 给出n种箱子,共k个物体,每个箱子必须装满,但是不一定k个物体都要装进去,求最大可装进去的物体数及箱子种类
题解 简单判断
代码 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <cstdio>
#include <iostream>
const int MAXN=100000 +5 ;
int k;long long max,maxcnt,maxid=1 ,box,n,tmp,r;
int main ()
{
std ::cin >>n>>k;
for (int i=1 ;i<=k;i++)
{
scanf ("%lld" ,&r);
box=n/r;
tmp=box*r;
if (tmp>max)
{
max=tmp;
maxid=i;
maxcnt=box;
}
}
std ::cout <<maxid<<' ' <<maxcnt;
return 0 ;
}