AtCoder Beginner Contest 182

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

好吧,我摊牌了,我不会!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值