HDU 6205 card card card

来源:互联网 发布:淘宝运营应该怎么做 编辑:程序博客网 时间:2024/05/16 10:45

题目地址
题意:给你n堆牌,原本每一堆的所有牌(a[i]张)默认向下,每次从第一堆开始,将固定个数的牌(b[i]张)翻上,然后下一堆继续,直到没有足够的牌翻上,然后你可以获得当前已经操作过的堆的所有牌。最初你可以调整堆的顺序,把第一堆放到最后一堆(逆时针旋转),你可以重复这个操作,问你要重复多少次这个操作,才能获得最多的牌。
思路:先把这个序列复制一遍放在原本序列的后面,这样的会就不用手动去改变牌的堆的顺序了。当i=n的时候结束就好了,每次遍历长度为n的序列。然后开始找,当有一个sum已经小于0
的话,就说明当前已经结束了,所以当前最大的牌数就是现在的总牌数,然后这个去与之前的比较,因为sum小于0了,所以当前的a[i]-b[i]是一定小于0的要不然在之前sum就小于0,所以从这个节点的后面开始重新计算就好了,因为在这个条件下,这个结果是最优的。然后最后取最大就好了。

#include <iostream>#include <cstring>#include <string>#include <queue>#include <vector>#include <map>#include <set>#include <stack>#include <cmath>#include <cstdio>#include <algorithm>#include <iomanip>#define N 2000010#define M 100010#define LL __int64#define inf 0x3f3f3f3f#define lson l,mid,ans<<1#define rson mid+1,r,ans<<1|1#define getMid (l+r)>>1#define movel ans<<1#define mover ans<<1|1using namespace std;const LL mod = 1000000007;int a[N];int b[N];int main() {    cin.sync_with_stdio(false);    int n;    int mmax;    int ans, sum, cnt, num;    int id;    while (cin >> n) {        for (int i = 0; i < n; i++) {            cin >> a[i];            a[i + n] = a[i];        }        for (int i = 0; i < n; i++) {            cin >> b[i];            b[i + n] = b[i];        }        mmax = 0;        id = 0;        sum = 0;        num = 0;        for (ans = 0; ans < n; ans = cnt + 1) {            for (cnt = ans; cnt < ans + n; cnt++) {                num += a[cnt];                sum += (a[cnt] - b[cnt]);                if (sum < 0) {                    if (mmax < num) {                        mmax = num;                        id = ans;                    }                    sum = 0;                    num = 0;                    break;                }            }            if (cnt == ans + n) {                id = ans;                break;            }        }        cout << id << endl;    }    return 0;}
原创粉丝点击