通师高专科技创新社周赛Round 3

P1634 禽兽的传染病

思路

  • 1.按题意模拟即可

坑点

  • 1.要开long long

代码

#include<bits/stdc++.h>
#define int long long
using namespace std;
signed main()
{
	int x, n;
	cin >> x >> n;
	int sum = 1;
	for (int i = 1; i <= n; i ++ )
	{
		sum += (sum * x);
	}
	cout << sum << endl;
	return 0;
}

总结

签到题

P1614 爱与愁的心痛

思路

  • 1.枚举每m个数,求和,然后对所有的和取最小值。

坑点

  • 1.要注意判断边界。
  • 2.开头范围是[1, n - m + 1].
  • 3.每个区间应该是[i, i + m - 1].

代码

#include<bits/stdc++.h>
using namespace std;
const int N = 3e3 + 10;
int a[N];
int main()
{
	int n, m;
	cin >> n >> m;
	int ans = 0x3f3f3f3f;
	for (int i = 1; i <= n; i ++ ) cin >> a[i];
	
	for (int i = 1; i <= n - m + 1; i ++ )
	{
		int sum = 0;
		for (int j = i; j <= i + m - 1; j ++ )
		{
			sum += a[j];
		}
		ans = min(ans, sum);
	}
	
	cout << ans << endl;
	return 0;
}

总结

签到题。

P1554 梦中的统计

思路

  • 1.哈希的方法存储每个数出现的次数。
  • 2.分解范围内的每一位数然后统计出现个数,最后按要求输出即可。

坑点

  • 无。

代码

#include<bits/stdc++.h>
using namespace std;

int Hash[12];

int main()
{
	int n, m;
	cin >> n >> m;
	for (int i = n; i <= m; i ++ )
	{
		int x = i;
		while (x > 0)
		{
			Hash[x % 10] ++;
			x /= 10;
		}
	}
	for (int i = 0; i <= 9; i ++ )
	{
		cout << Hash[i] << " ";
	}
	return 0;
}

总结

模拟。

P1007 独木桥

思路

  • 1.如果两个人相遇后掉头走,也可以理解为两个人擦肩而过。
  • 2.取最小值时取一个人走左右两边的最小值,用这个最小值去更新总的最小值,更新总的最小值需要用max更新,因为我们要取所有人的最小值,要选取的肯定就是所有最小值里的最大值。
  • 3.取最大值和最小值同理。

坑点

  • 1.无。

代码

#include<bits/stdc++.h>
using namespace std;
int main()
{
	int l, n; 
	cin >> l >> n;
	
	int minn = 0, maxn = 0;
	
	for (int i = 1; i <= n; i ++ )
	{
		int x; cin >> x;
		minn = max(minn, min(x - 0, l + 1 - x));
		maxn = max(maxn, max(x - 0, l + 1 - x));
	}
	cout << minn << " " << maxn << endl;
	return 0;
}

总结

贪心,思维。

P7585 [COCI2012-2013#1] LJUBOMORA

思路

  • 1.看到这题首先分析出嫉妒值越大,分到的弹珠就越多,嫉妒值越小,分到的弹珠就越小,符合单调性,所以确定用二分。
  • 2.因为嫉妒值符合单调性,那么就二分嫉妒值。
  • 3.设嫉妒值为x,那么每种弹珠可以分给sum/x个人,如果有余数,则人数+1
  • 4.如果人数大于实际有的人数,说明嫉妒值需要大一点则调整l
  • 5.如果人数小于实际有的人数,说明嫉妒值需要小一点则调整r

坑点

  • 1.判断时,不能写等号,因为等号就是符合要求的,不需要再变大或变小了,所以判断是不要等于。

代码

#include<bits/stdc++.h>
#define int long long
using namespace std;

int n, m;

const int N = 5e7 + 10;

int a[N];

bool check(int x)
{
	int sum = 0;
	for (int i = 1; i <= m; i ++ )
	{
		sum += a[i] / x;
		if (a[i] % x != 0)
		{
			sum ++;
		}
	}
	return sum > n; //坑点说明处
}

signed main()
{
	cin >> n >> m;
	int sum = 0;
	for (int i = 1; i <= m; i ++ )
	{
		cin >> a[i];
		sum += a[i];
	}
	int l = 0, r = sum;
	int ans;
	while (l <= r)
	{
		int mid = (l + r) / 2;
		if (check(mid))
		{
			l = mid + 1;
			
		}
		else
		{
			r = mid - 1;
			ans = mid;
		}
	}
	cout << ans << endl;
	return 0;
}

总结

二分答案

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值