解法:枚举四个顶点,最远点肯定是这四个之一。
#include
using namespace std;
typedef long long ll;
const int maxn = 1e5 + 7;
int main()
{
int n,t,m,r,c;
cin>>t;
while(t--)
{
cin>>n>>m>>r>>c;
int maxm=0;
maxm=max(maxm,abs(1-r)+abs(1-c));
maxm=max(maxm,abs(n-r)+abs(m-c));
maxm=max(maxm,abs(1-r)+abs(m-c));
maxm=max(maxm,abs(n-r)+abs(1-c));
cout<
解法:暴力枚举刷成每种颜色需要的天数。规模在10的7次方,轻松解决。不过此题可能有高效解法(DP?)
#include
using namespace std;
typedef long long ll;
const int maxn = 1e5 + 7;
int a[maxn];
int b[maxn];
int k, n;
void fenshua(int be, int c)
{
for (int i = be, j = 0; i < n && j < k; j++, i++)
{
b[i] = c;
}
}
int solve(int color)
{
int r = 0;
for (int i = 0; i < n; i++)
{
if (b[i] != color)
{
fenshua(i, color);
r++;
}
}
return r;
}
int main()
{
int t;
scanf("%d", &t);
while (t--)
{
scanf("%d%d", &n, &k);
for (int i = 0; i < n; i++)
{
scanf("%d", &a[i]);
}
int ans = 110000;
for (int i = 1; i <= 100; i++)
{
for (int j = 0; j < n; j++)
b[j] = a[j];
int day = solve(i); //刷成每一种所需的天数
// cout << day << endl;
ans = min(ans, day);
}
printf("%d\n", ans);
}
return 0;
}
题意:
一些cell,cell上可能存在平台
玩家必须从左边投球,使球首先落在cell的一个平台上。之后弹到下一个平台(p+k),之后是p+2k,以此类推,直到超过终点
注意:如果这些cell上不存在平台,你不能通过。
有两种操作:
x秒添加一个平台
y秒删除一个cell,减少第一个cell,并且重新编号其后的细胞(换句话说,用这个操作可以让某个cell无效化)
注意,不允许cell数量小于p
最小化时间
解法:删除第一个单元格等价于p+1。枚举删除前几个cell,并且计算每次补平台的花销。防止超时,对补平台的花销进行预处理,从后往前计算。
(比赛时候读错题可还行,我以为跳的时候可以随便删除。)
#include
using namespace std;
typedef long long ll;
const int maxn = 1e5 + 7;
string cell;
int n, p, k;
int x, y;
int price[maxn];//时间花费
void pre()
{
for (int i = n - 1; i >= 0; i -= k)
{
for (int j = 0, m = i; j < k&&m>=0; j++, m--)
{
if (cell[m] == '0')
price[m] = x;
if (i != n - 1)
price[m] += price[m + k];
}
}
}
int main()
{
ios::sync_with_stdio(0);//注意,关闭流同步之后不要用printf
int t;
cin >> t;
while (t--)
{
cin >> n >> p >> k;
cin >> cell;
cin >> x >> y;
int ans = INT_MAX;
for (int i = 0; i < n; i++)
price[i] = 0;
pre();
for (int i = 0; i < n && i + p - 1 < n; i++)
{
ans = min(ans, price[i + p - 1] + i * y);
}
cout << ans << endl;
}
return 0;
}