首页 > 其他分享 >P8901 [USACO22DEC] Circular Barn S

P8901 [USACO22DEC] Circular Barn S

时间:2024-06-08 17:12:22浏览次数:9  
标签:const int MAX P8901 倍数 Farmer primes Barn Circular

原题链接

题解

真tm麻烦

先考虑只有一个数的情况

假如我是后手,由于每次可以减123,无论对手减多少,我总可以使这一轮这个数总共减去的值为四的倍数
恰好当n位4的时候先手必败,所以如果一个数为四的倍数时,先手必败

考虑多个数

数组里,有的数是4的倍数,有的不是。
此时假设我是先手,遇到四的倍数,我要尽可能地减慢这个数变小的速度,对于非四倍数的数,我要尽可能加快变小的速度

code

#include <bits/stdc++.h>
using namespace std;

const int MAX_N = 100005;
const int MAX_P = 5000035;
const int MAX_V = 5000006;

int nums[MAX_N];
int primes[MAX_P];
int isComp[MAX_P] = {0};
int pCount = 1;
vector<int> pMod1, pMod2, pMod3;

void sieve() {
    primes[1] = 1;
    for (int i = 2; i <= MAX_V; i++) {
        if (!isComp[i]) {
            primes[++pCount] = i;
            if (i % 4 == 1) pMod1.push_back(i);
            if (i % 4 == 2) pMod2.push_back(i);
            if (i % 4 == 3) pMod3.push_back(i);
        }
        for (int j = 2; j <= pCount; j++) {
            if (primes[j] * i >= MAX_V) break;
            isComp[i * primes[j]] = 1;
            if (i % primes[j] == 0) break;
        }
    }
}

int main() {
    sieve();
    
    int t;
    cin >> t;
    while (t--) {
        int n;
        cin >> n;
        for (int i = 1; i <= n; i++) cin >> nums[i];
        
        int minStepsNhoj = INT_MAX, minStepsJohn = INT_MAX;
        int minIdxNhoj = -1, minIdxJohn = -1;
        
        for (int i = 1; i <= n; i++) {
            int num = nums[i];
            if (num % 4 == 0) {
                int steps = num / 4 + 1;
                if (steps < minStepsNhoj) {
                    minStepsNhoj = steps;
                    minIdxNhoj = i;
                }
            } else if (num % 4 == 1) {
                auto upper = upper_bound(pMod1.begin(), pMod1.end(), num);
                if (upper != pMod1.end()) {
                    int steps = (num - *(upper - 1)) / 4 + 1;
                    if (steps < minStepsJohn) {
                        minStepsJohn = steps;
                        minIdxJohn = i;
                    }
                }
            } else if (num % 4 == 2) {
                auto upper = upper_bound(pMod2.begin(), pMod2.end(), num);
                if (upper != pMod2.end()) {
                    int steps = (num - *(upper - 1)) / 4 + 1;
                    if (steps < minStepsJohn) {
                        minStepsJohn = steps;
                        minIdxJohn = i;
                    }
                }
            } else if (num % 4 == 3) {
                auto upper = upper_bound(pMod3.begin(), pMod3.end(), num);
                if (upper != pMod3.end()) {
                    int steps = (num - *(upper - 1)) / 4 + 1;
                    if (steps < minStepsJohn) {
                        minStepsJohn = steps;
                        minIdxJohn = i;
                    }
                }
            }
        }
        
        if (minStepsNhoj < minStepsJohn) {
            puts("Farmer Nhoj");
        } else if (minStepsNhoj > minStepsJohn) {
            puts("Farmer John");
        } else if (minIdxNhoj < minIdxJohn) {
            puts("Farmer Nhoj");
        } else {
            puts("Farmer John");
        }
    }
    return 0;
}

标签:const,int,MAX,P8901,倍数,Farmer,primes,Barn,Circular
From: https://www.cnblogs.com/pure4knowledge/p/18238769

相关文章

  • LeetCode 918. Maximum Sum Circular Subarray
    原题链接在这里:https://leetcode.com/problems/maximum-sum-circular-subarray/description/题目:Givena circularintegerarray nums oflength n,return themaximumpossiblesumofanon-empty subarray of nums.A circulararray meanstheendofthearray......
  • CircularQueue
    CircularQueue/*************************************************************filename:CircularQueueinterface*author:[email protected]*date:2024/04/23*function:MakegreatCVengineer*note......
  • Barnes-Hut t-SNE:大规模数据的高效降维算法
    在数据科学和分析中,理解高维数据集中的底层模式是至关重要的。t-SNE已成为高维数据可视化的有力工具。它通过将数据投射到一个较低维度的空间,提供了对数据结构的详细洞察。但是随着数据集的增长,标准的t-SNE算法在计算有些困难,所以发展出了Barnes-Hutt-SNE这个改进算法,它提供了一......
  • 340_依赖循环引用Relying upon circular references is discouraged and they are pro
    报错信息15:21:53.398[main]ERRORo.s.b.d.LoggingFailureAnalysisReporter-[report,40]-***************************APPLICATIONFAILEDTOSTART***************************Description:Thedependenciesofsomeofthebeansintheapplicationcontextf......
  • [USACO | Python] 201602B2 Circular Barn
    作为当代建筑的粉丝,农民约翰(John)建造了一个完美圆形的新谷仓。在里面,谷仓由n环组成房间,从1…n的顺时针方向编号。房间的有n个(1<=n<=1000)。每一间房间都有三扇门,两扇分别通往临近的房间,一扇通往谷仓的外面。FarmerJohn想要有准确的ri头牛在房间r中(1<=ri<=100),他......
  • P4084 [USACO17DEC] Barn Painting G
    原题链接题解1.对于没有固定颜色的节点来说,每个节点只会有三种颜色,而这又是一棵树,树形dp由此而来2.由相邻节点不同确定转移方程3.即使有求模也可能要开longlongcode#include<bits/stdc++.h>usingnamespacestd;#definelllonglongconstllmod=1e9+7;vector<ll>......
  • Barn
    P1937[USACO10MAR]BarnAllocationG题意抽象给定\(m\)个区间,\(n\)个位置,每个位置有一个最大被覆盖次数。在每个位置的被覆盖次数都符合要求的情况下求最多能选择的区间个数。思路我们可以发现,对于区间按照右端点排序,那么可以选择这个区间,那么肯定是最优的(这个证明可能类......
  • 解决vue项目build的时候报错Warning: Accessing non-existent property ‘cat‘ of mo
    *正在执行任务:npmrunbuild>[email protected]>nodebuild/build.js-buildingforproduction...(node:8992)Warning:Accessingnon-existentproperty'cat'ofmoduleexportsinsidecirculardependency(Use`node--trace-warnings...`t......
  • 洛谷_[P4084]Barn Painting G题解
    题目链接这题我们可以定义一个二维的dp数组,在dp[i][j]中:i表示对于节点i,j有1,2,3三种状态,表示当点i选择被染成颜色j时,以i为根的这颗子树有多少种染色方法。那么根据乘法原理,节点i的方案数肯定等于i的每个儿子的方案数量之积。这道题整个挺简单的,剩下细节......
  • Relying upon circular references is discouraged and they are prohibited by defau
    Relyinguponcircularreferencesisdiscouragedandtheyareprohibitedbydefault.创建springboot项目时,使用的版本是2.7.13,运行项目时报错Relyinguponcircularreferencesisdiscouragedandtheyareprohibitedbydefault.Updateyourapplicationtoremovethe......