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;
}
总结
二分答案