Codeforces补题2020.3.2 (Round621 Div2)
A.Cow and Haybales
美国建设行动(USACO)最近命令农夫约翰在农场上布置n堆干草堆。第i堆包含ai haybales。
但是,农夫约翰刚刚去度假,贝西独自一人。每天,顽皮的贝西(Bessie)可以选择将任何干草堆中的任何干草捆移到相邻的干草堆中。形式上,她有一天可以选择两个索引i和j(1≤i,j≤n),使得| i | j | = 1且ai> 0并应用ai = ai-1,aj = aj + 1。她也可能因为懒惰而决定在某些日子不做任何事情。
贝西想使第1堆中的干草草数量最大化(即使a1最大化),而在农夫约翰回来之前,她只有d天的时间这样做。如果她的行为最佳,请帮助她找到最大的草捆数量!
输入值 输入包含多个测试用例。第一行包含一个整数t(1≤t≤100)-测试用例的数量。接下来的2t行包含测试用例的描述-每个测试用例两行。
每个测试用例的第一行包含整数n和d(1≤n,d≤100)-分别是干草堆的数量和天数。
每个测试用例的第二行包含n个整数a1,a2,…,an(0≤ai≤100)—每堆中的干草草数量。
输出量 对于每个测试用例,输出一个整数:如果Bessie表现最佳,则在d天后可能堆入1号草堆的最大草捆数量。
题解:
从头开始依次遍历每个草堆即可。
简单题。
#include<bits/stdc++.h> using namespace std; const int maxn=1014; int a[maxn]; int T; int N,K; int main () { scanf("%d",&T); while (T--) { scanf("%d%d",&N,&K); vector<int> vi; for (int i=1;i<=N;i++) scanf("%d",&a[i]); for (int i=2;i<=N;i++) { if (!a[i]) continue; while (K>=i-1&&a[i]) { a[1]++; a[i]--; K=K-(i-1); } } printf ("%d ",a[1]); } return 0; }
贝茜有太多的朋友,因为她是每个人最喜欢的母牛!她的新朋友Rabbit(Rabbit)试图越过以便他们玩!
更具体地说,他希望通过进行多跳来从(0,0)变为(x,0)。如果跳的端点之间的欧几里得距离是它的n个最喜欢的数字之一:a1,a2,…,an,他只愿意在2D平面上从一个点跳到另一个点。 Rabbit从(0,0)到(x,0)所需的最小跳数是多少?兔子可能会落在具有非整数坐标的点上。可以证明,兔子总是可以到达目的地。
回想点(xi,yi)和(xj,yj)之间的欧几里得距离为(xi-xj)2+(yi-yj)2 --------------------- √。
例如,如果Rabbit有喜欢的数字1和3,则他可以从两步跳中从(0,0)跳到(4,0),如下所示。请注意,还有其他有效的方法可以在2跳中跳到(4,0)(例如(0,0)→(2,−5–√)→(4,0))。
这是第一个示例的图形。这两跳的距离均为3,这是Rabbit最喜欢的数字之一。 换句话说,Rabbit每次选择一些数字ai,并在他想要的任何方向上选择距离等于ai的跃点。同一号码可以多次使用。
输入值 输入包含多个测试用例。第一行包含一个整数t(1≤t≤1000)-测试用例的数量。接下来的2t行包含测试用例-每个测试用例两行。
每个测试用例的第一行包含两个整数n和x(1≤n≤105,1≤x≤109),分别是喜欢的数字和Rabbit希望移动的距离。
每个测试用例的第二行包含n个整数a1,a2,…,an(1≤ai≤109)—兔子最喜欢的数字。可以保证最喜欢的数字是不同的。
保证所有测试用例的n之和不超过105。
输出量 对于每个测试用例,请打印一个整数-所需的最小跃点数。
题解:
依次遍历每个喜欢的数字,如果等于需要移动的距离输出1,如果只有大于的输出2,如果都小于就分类讨论。
#include<bits/stdc++.h> using namespace std; const int maxn=100014; int a[maxn]; bool cmp (int a,int b) { return a>b; } int N,d; int main () { int T; scanf("%d",&T); while (T--) { scanf("%d%d",&N,&d); for (int i=1;i<=N;i++) scanf("%d",&a[i]); sort(a+1,a+N+1,cmp); int ans=1e9; for (int i=1;i<=N;i++) { if (a[i]>d) ans=min(ans,2); if (a[i]==d) ans=1; if (a[i]<d) { ans=min(ans,(d+a[i]-1)/a[i]); } } printf ("%d ",ans); } return 0; }