AtCoder Beginner Contest 182
文章目录
一、twiblr
1.题目
题目描述:
你目前关注了B个人,而且有A个人关注了你,但是你的最大关注的人数为2*A+100。求你还需关注多少人?
2.思路
无脑码字,老签到题了!!!!!
3.参考代码
#include<bits/stdc++.h>
using namespace std;
int main()
{
int a, b;
cin >> a >> b;
cout << 2 * a + 100 - b << endl;
}
二、Almost GCD
1.题目
题目描述:
给你一个长度为n的数组,求数组中出现次数最多的因子(大于1)
2.思路
将每一个ai的因子都求出来,然后记录个因子的个数,输出最多数量对于的因子即可。(也是个签到题呀!)
3.参考代码
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e3 + 20;
int a[200], n;
int vis[maxn];
int maxx = 0, maxi = 0;
void check(int x)
{
int flag = 0;
for (int i = 2; i * i <= x; i++)
{
if (x % i == 0)
{
flag = 1;
vis[i]++;
vis[x / i]++;
if (vis[i] > maxx)
{
maxx = vis[i];
maxi = i;
}
if (vis[x / i] > maxx)
{
maxx = vis[x / i];
maxi = x / i;
}
}
}
if (flag == 0)
{
vis[x]++;
if (vis[x] > maxx)
{
maxx = vis[x];
maxi = x;
}
}
}
int main()
{
scanf("%d", &n);
for (int i = 1; i <= n; i++)
{
scanf("%d", &a[i]);
check(a[i]);
}
printf("%d\n", maxi);
}
三、To 3
1.题目
题目描述:
给定一个数n,数的长度为k,求最小删除多少个某些位上的数,使得剩余位上的和是3的倍数(最多删除k-1个数)。最后不能组成3的倍数则输出-1
2.思路
将每一位上的数相加得到sum,如果正好是3的倍数的话就可以不用删除。
但是如果sum%3=1时,我们要删去多余的那个1可有两种删法:删去一个1或者删去两个2,因为要删去个数最小我们当然要先考虑前者,当前者不行时便来考虑后者,但是要记得判断-1的情况。
sum%3=2也可删去一个2或者两个1,想法也就和等于1的一样。
3.参考代码
#include<bits/stdc++.h>
using namespace std;
map<int, int>m;
int main()
{
string s;
cin >> s;
int sum = 0;
for (int i = 0; i < s.length(); i++)
{
int x = s[i] - '0';
sum += x;
m[x % 3]++;
}
if (sum % 3 == 0)printf("0\n");
else
{
if (s.length() == 1 && sum % 3 != 0)printf("-1\n");
else
{
if (sum % 3 == 1)
{
if (m[1] > 0 && s.length() > 1)printf("1\n");
else if (m[2] >= 2 && s.length() > 2)printf("2\n");
else printf("-1\n");
}
else
{
if (m[2] > 0 && s.length() > 1)printf("1\n");
else if (m[1] >= 2 && s.length() > 2)printf("2\n");
else printf("-1\n");
}
}
}
}
四、Wandering
1.题目
题目描述:
一个机器人开始在坐标为0的位置,先沿正方向走a1步,然后沿正方向走a1、a2步,一直到最后沿正方向走a1、a2、……、an步,求该过程中走到的最远坐标。
2.思路
前缀和思想。只需要在求前缀和的同时维护一个最大前缀和,说明在第i次移动中当前位置加上最大前缀和就是能到达的最远距离,每次走完更新答案取最大值即可。
3.参考代码
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int maxn = 2 * 1e5 + 10;
ll a[maxn], sum[maxn];
int n;
int main()
{
scanf("%d", &n);
for (int i = 1; i <= n; i++)
{
scanf("%lld", &a[i]);
sum[i] = sum[i - 1] + a[i];
}
ll ss = 0;
ll maxx = LLONG_MIN;
ll ans = LLONG_MIN;
for (int i = 1; i <= n; i++)
{
maxx = max(maxx, sum[i]);
ans = max(ans, maxx + ss);
ss += sum[i];
}
if (ans < 0)ans = 0;
printf("%lld\n", ans);
}
五、Akari
1.题目
题目描述:
一个矩阵,有灯有墙,墙会挡住灯的光,光能在没有墙的情况下无限向上下左右四个方向照射。问整个矩阵能照亮的方格为多少?
2.思路
直接对每个灯进行模拟,向四个方向遍历,直到遇到砖块或者灯就停下。(刚开始怕超时没敢尝试,但是最后发现竟然没TLE,真是时间管理大师 )。
3.参考代码
#include<bits/stdc++.h>
using namespace std;
int a[1510][1510];
int xx[500010], yy[500010];
int h, w, n, m, ans;
int main()
{
scanf("%d %d %d %d", &h, &w, &n, &m);
ans = n;
for (int i = 1; i <= n; i++)
{
scanf("%d %d", &xx[i], &yy[i]);
a[xx[i]][yy[i]] = 2;
}
for (int i = 1; i <= m; i++)
{
int x, y;
scanf("%d %d", &x, &y);
a[x][y] = -1;
}
for (int i = 1; i <= n; i++)
{
int x = xx[i], y = yy[i];
for (int j = x + 1; j <= h; j++)
{
if (a[j][y] == -1 || a[j][y] == 2)break;
a[j][y] = 1;
}
for (int j = x - 1; j > 0; j--)
{
if (a[j][y] == -1 || a[j][y] == 2)break;
a[j][y] = 1;
}
for (int j = y + 1; j <= w; j++)
{
if (a[x][j] == -1 || a[x][j] == 2)break;
a[x][j] = 1;
}
for (int j = y - 1; j > 0; j--)
{
if (a[x][j] == -1 || a[x][j] == 2)break;
a[x][j] = 1;
}
}
for (int i = 1; i <= h; i++)
{
for (int j = 1; j <= w; j++)
if (a[i][j] == 1)ans++;
}
printf("%d\n", ans);
}
六、Valid payments
好吧,我摊牌了,我不会!