题目大意:给你n堆牌,每堆牌有一定的数量,以及对应的惩罚值。游戏规则:从第一张牌开始,依次拿牌,sum初始为0,每次拿牌,sum加上牌数减去惩罚值,当sum小于0时结束拿牌。在游戏开始之前,你可以进行无限次将第一张牌移动到最后。求拿牌数量最多时,最少移动的牌的数量。使sum小于0的那堆牌也拿掉。
题目链接:HDU - 6205
思路:把这n堆牌复制一遍放到原来序列的后面,暴力就可以了。
#include<iostream>
#include<cstdio>
#include<string.h>
using namespace std;
#define inf 0x3f3f3f
const int N=1e6+5;
int a[N<<1],b[N<<1];
int main()
{
int n;
while(~scanf("%d",&n))
{
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
for(int i=1;i<=n;i++)
scanf("%d",&b[i]);
for(int i=n+1;i<=2*n;i++)
{
a[i]=a[i-n];
b[i]=b[i-n];
}
int sum,ans,cnt;
int maxi=-inf,u;
for(int i=1;i<=n;i=cnt+1)//i=cnt+1
{
sum=0;ans=0;
for(int j=i;j<i+n&&sum>=0;j++)//j<i+n:最多拿n张牌
{
sum=sum+a[j]-b[j];
ans+=a[j];
cnt=j;
}
if(ans>maxi)
{
maxi=ans;
u=i;
}
}
printf("%d\n",u-1);
}
return 0;
}