题面:
It is nighttime and Joe the Elusive got into the country’s main bank’s safe. The safe has n cells positioned in a row, each of them contains some amount of diamonds. Let’s make the problem more comfortable to work with and mark the cells with positive numbers from 1 to n from the left to the right.
Unfortunately, Joe didn’t switch the last security system off. On the plus side, he knows the way it works.
Every minute the security system calculates the total amount of diamonds for each two adjacent cells (for the cells between whose numbers difference equals 1). As a result of this check we get an n - 1 sums. If at least one of the sums differs from the corresponding sum received during the previous check, then the security system is triggered.
Joe can move the diamonds from one cell to another between the security system’s checks. He manages to move them no more than m times between two checks. One of the three following operations is regarded as moving a diamond: moving a diamond from any cell to any other one, moving a diamond from any cell to Joe’s pocket, moving a diamond from Joe’s pocket to any cell. Initially Joe’s pocket is empty, and it can carry an unlimited amount of diamonds. It is considered that before all Joe’s actions the system performs at least one check.
In the morning the bank employees will come, which is why Joe has to leave the bank before that moment. Joe has only k minutes left before morning, and on each of these k minutes he can perform no more than m operations. All that remains in Joe’s pocket, is considered his loot.
Calculate the largest amount of diamonds Joe can carry with him. Don’t forget that the security system shouldn’t be triggered (even after Joe leaves the bank) and Joe should leave before morning.
Input
The first line contains integers n, m and k (1 ≤ n ≤ 104, 1 ≤ m, k ≤ 109). The next line contains n numbers. The i-th number is equal to the amount of diamonds in the i-th cell — it is an integer from 0 to 105.
Output
Print a single number — the maximum number of diamonds Joe can steal.
题目大意:
有n个连续的房间,每个房间里放了a[i]个钻石。一共有k分钟,每分钟能做m次操作。可以的操作有::把一颗钻石从某一堆移到另一堆 or 把一颗钻石从某一堆中装进口袋 or把一颗钻石从口袋取出放入某一堆钻石 。
要求:每分钟后,相邻两堆的钻石数量不变。问k分钟后最多可以带走多少钻石。
大致思路:
一堆钻石的数量减少,相邻的堆的钻石数量就要增加。所以易推得:偶数堆钻石无法拿走,奇数堆钻石每拿走一个,需要额外移位n/2次。所以,如果n/2+1>m则不能拿走钻石。
设奇数堆钻石数量不限制,则最多能拿走钻石的个数为m/(n/2+1)*k个,然后与实际奇数堆钻石的最小值取最小,就是结果。因为当任意一个奇数堆的钻石被取完,就无法继续拿走。
代码:
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdlib>
using namespace std;
long long n,dia[10010],m,ans=0,mis=100000,k,need=0;//用long会爆
int main()
{
ios::sync_with_stdio(false);
cin>>n>>m>>k;
for(int i=1;i<=n;++i){
cin>>dia[i];
if(mis>dia[i]&&i%2==1)//在读取时直接取奇数堆最小值
mis=dia[i];
}
need=n/2+1;
if(n%2==0||need>m);//n为偶数直接不考虑
else{
ans=m/need*k;
ans=min(mis,ans);
}
cout<<ans<<endl;
return 0;
}