外观
USACO 2024 January Contest, Bronze
[USACO24JAN] Majority Opinion B
题目描述
Farmer John 有一项重要的任务——弄清楚要为他的奶牛们购买什么类型的干草。
Farmer John 的
为了实现这一目标,Farmer John 可以主持焦点小组访谈。一次焦点小组访谈为让编号从
Farmer John 想知道哪些类型的干草有可能变为同时受到所有奶牛的喜爱。他一次只能主持一个焦点小组访谈,但为了使所有奶牛都喜欢同一类型的干草,他可以根据需要任意多次地主持焦点小组访谈。
输入格式
输入的第一行包含一个整数
每一个测试用例的第一行包含
第二行包含
输入保证所有测试用例的
输出格式
输出
如果可能使所有奶牛同时喜欢同一种干草,则以升序输出所有可能的此类干草的类型,否则输出
输入输出样例 #1
输入 #1
5
5
1 2 2 2 3
6
1 2 3 1 2 3
6
1 2 1 2 2 2
3
3 2 3
2
2 11
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
输出 #1
2
-1
1 2
3
-11
2
3
4
5
2
3
4
5
说明/提示
样例解释
在输入样例中,有 5 个测试用例。
在第一个测试用例中,仅可能使所有奶牛喜欢种类
在第二个测试用例中,可以证明没有奶牛会改变她们喜爱的干草种类。
在第三个测试用例中,有可能使所有奶牛喜欢种类
在第四个测试用例中,有可能使所有奶牛喜欢种类
在第五个测试用例中,可以证明没有奶牛会改变她们喜爱的干草种类。
测试点性质
- 测试点
: 。 - 测试点
: 。 - 测试点
:对于所有的 ,有 。 - 测试点
:没有额外限制。
代码样例
c++
#include<iostream>
using namespace std;
int T,n,h[100005];
bool f[100005];//用于标记此干草类型是否可能受到所有奶牛的喜爱
int main(){
scanf("%d",&T);//输入操作次数
while(T--){
scanf("%d%d",&n,&h[1]);
for(int i=2;i<=n;i++){
scanf("%d",&h[i]);
if(!f[h[i]]&&(h[i]==h[i-1]||h[i]==h[i-2]))//判断h[i]是否符合要求
f[h[i]]=true;//符合要求时打标记
}bool flag=true;//用于判断是否无解
for(int i=1;i<=n;i++)
if(f[i])printf("%d ",i),f[i]=flag=false;//别忘记将f数组清零
if(flag)printf("-1");//无解时,输出-1
putchar('\n');//最后注意要输出换行符
}
return 0;
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
[USACO24JAN] Cannonball B
题目描述
Bessie 已经精通了变成炮弹并沿着长度为
从
如果 Bessie 弹跳无限长的时间或直到她离开数轴,她会击破多少个炮击目标?
如果 Bessie 开始时位于一个她可以击破的炮击目标,她会立刻这样做。类似地,如果 Bessie 开始时位于一个跳板,跳板的效果将在她第一次跳跃之前生效。
输入格式
输入的第一行包含
以下
输出格式
输出一个整数,为将被击破的炮击目标数量。
输入输出样例 #1
输入 #1
5 2
0 1
1 1
1 2
0 1
1 11
2
3
4
5
6
2
3
4
5
6
输出 #1
11
输入输出样例 #2
输入 #2
6 4
0 3
1 1
1 2
1 1
0 1
1 11
2
3
4
5
6
7
2
3
4
5
6
7
输出 #2
31
说明/提示
样例解释 1
Bessie 从坐标
样例解释 2
Bessie 经过的路径为
测试点性质
- 测试点
: 。 - 测试点
: 。 - 测试点
:没有额外限制。
代码样例
c++
#include <iostream>
#include <cstdio>
#include <algorithm>
#define int long long // 使用 long long 类型,防止数据溢出
using namespace std;
int n, nw, p = 1, ti = 1, a[1000001], b[1000001], pd[1000001], pp[1000001], tt[1000001], ans;
signed main() {
// 输入数轴长度和起始位置
cin >> n >> nw;
// 读取每个位置的物体类型和数值
for (int i = 1; i <= n; i++) {
cin >> a[i] >> b[i];
}
// 模拟 Bessie 的弹跳过程
while (nw >= 1 && nw <= n) {
// 如果当前位置是炮击目标
if (a[nw]) {
// 如果炮击目标未被击破且当前能量足够击破
if (!pd[nw] && p >= b[nw]) {
pd[nw] = 1; // 标记炮击目标已击破
pp[nw] = p; // 记录击破时的能量
tt[nw] = ti; // 记录击破时的方向
ans++; // 增加击破的炮击目标数量
}
// 如果当前状态与之前击破该炮击目标时的状态相同,说明进入无限循环,直接退出
else if (pp[nw] == p && tt[nw] == ti) {
break;
}
}
// 如果当前位置是跳板
else {
p += b[nw]; // 增加能量
ti *= -1; // 反转方向
}
// 计算下一次弹跳的位置
nw += p * ti;
}
// 输出击破的炮击目标数量
cout << ans;
return 0;
}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
39
40
41
42
43
44
45
46
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
39
40
41
42
43
44
45
46
[USACO24JAN] Balancing Bacteria B
题目描述
Farmer John 有
Farmer John 想要确保每一块草地都被修复至健康的细菌水平。方便的是,他有两种品牌的农药可以喷洒在他的田地里,一种可以添加细菌,另一种可以去除细菌。当 Farmer John 喷洒任一类型的农药时,他站在草地
喷雾器对靠近 Farmer John 的草地效果最大,随着距离增加效果逐渐减弱。如果 Farmer John 选择添加细菌的农药,则
求 Farmer John 使用喷雾器的最少次数,使得每块草地都具有健康草的推荐细菌值。输入保证答案不超过
注意这个问题涉及到的整数可能需要使用 64 位整数型(例如,C/C++ 中的 "long long")。
输入格式
输入的第一行包含
第二行包含
输出格式
输出一个整数,为使每块草地都具有健康草的推荐的细菌值所需使用喷雾器的最少次数。
输入输出样例 #1
输入 #1
2
-1 31
2
2
输出 #1
61
输入输出样例 #2
输入 #2
5
1 3 -2 -7 51
2
2
输出 #2
261
说明/提示
样例解释 1
使用去除细菌的农药,功率等级为
测试点性质
- 测试点
: ,答案不超过 。 - 测试点
: 。 - 测试点
:没有额外限制。
代码样例
- 一篇带你速通差分算法(C/C++)-CSDN博客
- 题意:给定数组 a,可以在任意位置 i 加上(或减去)一个首项为 1,公差为 1,长度为 n−i+1(即结束点为 n)的等差数列。问需要加(或减)几个等差数列可使 a 中的值全为 0。
此题正解应为:二阶差分。
观察到
| 等差数列 | 1 | 2 | 3 | 4 | 5 |
|---|---|---|---|---|---|
| 差分一次 | 1 | 1 | 1 | 1 | 1 |
| 差分两次 | 1 | 0 | 0 | 0 | 0 |
可得结论:在差分两次后的数组的 i 位置上加 1,就等价于在原数组 i 至 n 上加上了一个首项为 1 公差为 1 的等差数列。
所以,数组 a 两次差分后所有数的绝对值的和,即为将原数列应加上等差数列的个数。
c++
#include <iostream>
#include <cmath>
using namespace std;
long long n,a[200010],s[200010],s2[200010],ans=0;
//别忘了long long
int main(){
cin>>n;
for(int i = 1;i<=n;i++){
cin>>a[i];
s[i]=a[i]-a[i-1];
s2[i]=s[i]-s[i-1];
ans+=abs(s2[i]);
}
cout<<ans;
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
