T1 ABC问题
问题描述
Farmer John 的奶牛正在 “mooZ” 视频会议平台上举行每日集会。她们发明了一个简单的数字游戏,为会议增添一些乐趣。
Elsie 有三个正整数 A、B 和 C(A <= B <= C)。这些数字是保密的,她不会直接透露给她的姐妹 Bessie。她告诉 Bessie 七个范围在 1 … 10^9 之间的整数(不一定各不相同),并宣称这是 A、B、C、A+B、B+C、C+A 和 A+B+C 的某种排列。
给定这七个整数,请帮助 Bessie 求出 A、B 和 C。可以证明,答案是唯一的。
输入格式
输入一行,包含七个空格分隔的整数。
输出格式
输出 A、B 和 C,用空格分隔。
输入样例
2 2 11 4 9 7 9
None
输出样例
2 2 7
None
测试点性质
测试点 2-3 满足 C <= 50。
测试点 4-10 没有额外限制。
思路
依题
A
≤
B
≤
(
C
?
A
+
B
)
≤
A
+
C
≤
B
+
C
≤
A
+
B
+
C
A \leq B \leq (C ? A+B)\leq A +C\leq B+ C \leq A + B + C
A≤B≤(C?A+B)≤A+C≤B+C≤A+B+C
因为C和A+B的值不确定,所以排序判断一下输出即可
代码
#include <bits/stdc++.h>
using namespace std;
int a[10];
int main(){
for(int i = 1; i <= 7; ++i)
cin >> a[i];
sort(a + 1 , a + 8);
cout << a[1] << " " << a[2] << " ";
if(a[1] + a[2] == a[3])
cout << a[4] << endl;
else
cout << a[3]<< endl;
return 0;
}
T2 雏菊花环
问题描述
每天,作为她绕农场行走的一部分,奶牛 Bessie 会经过她最喜爱的草地,其中种有 N 朵花(五颜六色的雏菊),编号为 1…N(1≤N≤100),排列成一行。花 i 有 pi 朵花瓣(1 ≤ pi ≤ 1000 )。
作为一名崭露头角的摄影家,Bessie 决定给这些花拍些照片。具体地说,对于每一对满足 1 ≤ i ≤ j ≤ N 的花 (i , j),Bessie 会给从花 i 到花 j 之间的所有花(包括 i 和 j)拍一张照。
后来 Bessie 查看这些照片时注意到有些照片里存在「平均」的花——一朵恰好有 P 朵花瓣的花,其中 P 等于照片中所有花的花瓣数量的平均值。
Bessie 的照片中有几张存在平均的花?
输入格式
输入的第一行包含 N。第二行包含 N 个空格分隔的整数 p1…pN。
输出格式
输出存在平均的花的照片数量。
输入样例
4
1 1 2 3
None
输出样例
6
None
样例说明
每张仅包含一朵花的照片均会被计入答案(在这个样例中有 4 张)。另外,在这个样例中 (i , j) 为 (1,2) 和 (2,4) 所对应的照片也存在平均的花。
思路
单朵花可以直接加上,然后通过map O(n ^ 2)运算
每次依次向后枚举,每朵花用map储存一下,在第一次循环中清零,计算出平均数,找map中这朵花存不存在统计一下
代码
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int MAXN = 110;
map <int , int> mp;
int a[MAXN] , n , ans;
signed main(){
cin >> n;
for(int i = 1; i <= n; ++i)
cin >> a[i];
ans = n;
for(int i = 1; i < n; ++i){
mp.clear();
mp[a[i]]++;
int tmps = a[i];
for(int j = i + 1; j <= n; ++j){
mp[a[j]]++;
tmps += a[j];
int temp = tmps / (j - i + 1);
if(mp[temp] && (temp * (j - i + 1) == tmps)) ans++;
}
}
cout << ans << endl;
return 0;
}
T3一成不变
问题描述
Farmer John 最近扩大了他的农场,从奶牛们的角度看来这个农场相当于是无限大了!奶牛们将农场上放牧的区域想作是一个由正方形方格组成的无限大二维方阵,每个方格中均有美味的草(将每个方格看作是棋盘上的一个方格)。Farmer John 的 N 头奶牛(1≤N≤50)初始时位于不同的方格中,一部分朝向北面,一部分朝向东面。
每一小时,每头奶牛会执行以下二者之一:
如果她当前所在的方格里的草已经被其他奶牛吃掉了,则她会停下。
吃完她当前所在的方格中的所有草,并向她朝向的方向移动一个方格。
经过一段时间,每头奶牛的身后会留下一条被啃秃了的轨迹。
如果两头奶牛在一次移动中移动到了同一个有草的方格,她们会分享这个方格中的草,并在下一个小时继续沿她们朝向的方向移动。
请求出每头奶牛吃到的草的数量。有些奶牛永远不会停下,从而吃到无限多的草。
输入格式
输入的第一行包含 N。以下 N 行,每行描述一头奶牛的起始位置,包含一个字符 N(表示朝向北面) 或 E(表示朝向东面),以及两个非负整数 x 和 y(,)表示方格的坐标。所有 x 坐标各不相同,所有 y 坐标各不相同。
为了使方向和坐标尽可能明确,如果一头奶牛位于方格 (x,y) 并向北移动,她会到达方格 (x,y+1)。如果她向东移动,她会到达方格 (x+1,y)。
输出格式
输出 N 行。输出的第 i 行包含输入中的第 i 头奶牛吃到草的方格的数量。如果一头奶牛可以吃到无限多的草,为这头奶牛输出 “Infinity”。
输入样例
6
E 3 5
N 5 3
E 4 6
E 10 4
N 11 2
N 8 1
None
输出样例
5
3
Infinity
Infinity
2
5
None
测试点性质
测试点 2-5 中,所有坐标不超过 100。
测试点 6-10 没有额外限制。
思路
分析可以发现,坐标和较小的,有可能会被较大的挡住前路,则sort排序,从较大的开始遍历,逐一判断当前牛是否会被更大的挡住,将所有比当前牛大的牛都遍历,因为如果不被这头牛挡住,那么可能就会被下一头牛挡住;
方向相同不会互相妨碍
方向不同,但是坐标和相同也不会互相妨碍,两头牛同时到达一个方格可以同时
方向不同,坐标和不同,则要找到能够挡住当前牛,使得其行进最短距离,注意考虑前一头牛停住、以及x、y坐标位置,找到距离交点的最小距离
代码
#include <bits/stdc++.h>
using namespace std;
#define INF 1000000009
struct nod{
char ch;
int id;
long long x , y , ans;
}a[110];
bool cmp1(nod A , nod B){
return A.x + A.y > B.x + B.y;
}
bool cmp2(nod A , nod B){
return A.id < B.id;
}
int main(){
int n;
cin >> n;
for (int i = 1; i <= n; i++){
cin >> a[i].ch >> a[i].x >> a[i].y;
a[i].id = i;
a[i].ans = INF;
}
sort(a + 1, a + n + 1, cmp1);
for(int i = 1; i <= n; i++){
for(int j = i - 1; j >= 1; j--){
if(a[i].x + a[i].y == a[j].x + a[j].y) continue;
if(a[i].ch == a[j].ch) continue;
if(a[i].ch == 'E' && a[j].ch == 'N'){
if(a[i].y < a[j].y) continue;
if(a[j].ans == INF){
a[i].ans = min(a[i].ans , a[j].x - a[i].x);
}
else{
if(a[j].y + a[j].ans > a[i].y)
a[i].ans = min(a[i].ans , a[j].x - a[i].x);
}
}
else if(a[i].ch == 'N' && a[j].ch == 'E'){
if(a[i].x < a[j].x) continue;
if(a[j].ans == INF)
a[i].ans = min(a[i].ans , a[j].y - a[i].y);
else{
if(a[j].x + a[j].ans > a[i].x)
a[i].ans = min(a[i].ans , a[j].y - a[i].y);
}
}
}
}
sort(a + 1, a + n + 1, cmp2);
for(int i = 1; i <= n; i++){
if (a[i].ans == INF)
cout << "Infinity" << endl;
else
cout << a[i].ans << endl;
}
return 0;
}