【USACO2.2】解题报告

USACO铜组测试2解题报告 USACO 2021年1月铜组 阅读详情

前言

在这里插入图片描述
然而只有一道动态规划的题目。。。
其他三道题都是模拟。。。
难度还是有所增加的。至少在洛谷中又有一道蓝题了。
USACO:http://train.usaco.org


USACO2.2.3.Preface Numbering

思路:
我们会发现罗马数字中每一位都是独立的。不会遭到其他位的干扰。
例如数字 3197 3197 3197和 1132 1132 1132和 7108 7108 7108,他们的百位都是 1 1 1,但是其他位没有一样的,但是百位的表示还都是不变的。
那么就一位一位地处理,从高位到低位一个一个输出即可。


代码:

#include <cstdio>
#include <iostream>
using namespace std;

const char ch[8]={' ','I','V','X','L','C','D','M'};
const int num[8]={0,1,5,10,50,100,500,1000};
int n,ans[8];

void work(int x,int i)
{
    if (x==1) ans[i*2-1]++;  //按位输出
    if (x==2) ans[i*2-1]+=2;
    if (x==3) ans[i*2-1]+=3;
    if (x==4) ans[i*2]++,ans[i*2-1]++;
    if (x==5) ans[i*2]++;
    if (x==6) ans[i*2]++,ans[i*2-1]++;
    if (x==7) ans[i*2]++,ans[i*2-1]+=2;
    if (x==8) ans[i*2]++,ans[i*2-1]+=3;
    if (x==9) ans[i*2+1]++,ans[i*2-1]++;
}

int main()
{
    scanf("%d",&n);
    for (int j=1;j<=n;j++)
    {
        int x=j;
        for (int i=1;x;i++)
     	{
            work(x%10,i);  //一位一位输出
            x/=10;
        }
    } 
    for (int i=1;i<=8;i++)
     if (ans[i])
      cout<<ch[i]<<' '<<ans[i]<<endl;
    return 0;
}

USACO2.2.4.Subset Sums

思路:
很明显的 D P DP DP啊。
题目可以等价的转换为求在 1 ∼ n 1\sim n 1∼n中选出几个数使得和为 1 + 2 + 3 + . . . + n 2 \frac{1+2+3+ ... +n}{2} 21+2+3+...+n​的方案数。
很明显可以设 f [ i ] [ j ] f[i][j] f[i][j]表示选完 i i i个数,和为 j j j的方案数。那么就有
f [ i ] [ j ] + = f [ i − 1 ] [ j − i ] f[i][j]+=f[i-1][j-i] f[i][j]+=f[i−1][j−i]
那么答案就是 f [ n ] [ 1 + 2 + 3 + . . . + n 2 ] = f [ n ] [ n ( 1 + n ) 2 2 ] = f [ n ] [ n ( 1 + n ) 4 ] f[n][\frac{1+2+3+ ... +n}{2}]=f[n][\frac{\frac{n(1+n)}{2}}{2}]=f[n][\frac{n(1+n)}{4}] f[n][21+2+3+...+n​]=f[n][22n(1+n)​​]=f[n][4n(1+n)​]
那么如果 n ( 1 + n ) n(1+n) n(1+n)不是 4 4 4的倍数就输出 0 0 0好了。


优化:
可以利用背包的思想将第一位省略掉。


代码:

#include <cstdio>
#define ll long long
using namespace std;

int n,m;
ll f[1300];

int main()
{
    scanf("%d",&n);
    m=(n+1)*n/2;
    if (m%2) return !printf("0\n");  //特判
    m/=2;
    f[0]=1;
    for (int i=1;i<=n;i++)
     for (int j=m;j>=i;j--)  //省略一维之后一定要倒序!
      f[j]+=f[j-i];
    printf("%lld\n",f[m]/2);
    return 0;
} 

USACO2.2.5.Runaround Numbers

思路:
直接暴力模拟,每一个数判断一下即可。
毫无难度。注意细节。


代码:

#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;

int m,n,len,a[30];
bool vis[30],ok;

bool check()
{
    memset(vis,0,sizeof(vis));
    int x=1;
    for (int i=1;i<=len;i++)
    {
        x=(x+a[x])%len;
        if (!x) x=len;
        if (vis[x]) return 0;  //不是回文数
        vis[x]=1;
    }
    return 1;
}

int main()
{
    scanf("%d",&m);
    do
    {
        Continue:
        m++;
        n=m;
        len=0;
        ok=1;
        memset(vis,0,sizeof(vis));
        while (n)
        {
            a[++len]=n%10;
            if (vis[a[len]]) goto Continue;  //break诡异的出错了,所以选择了goto。但是建议少用goto!
            vis[a[len]]=1;
            n/=10;
        }
        for (int i=1;i<=len/2;i++)
         swap(a[i],a[len-i+1]);
    }
    while (!check());
    for (int i=1;i<=len;i++)
     printf("%d",a[i]);
    printf("\n");
    return 0;
}

USACO2.2.6.Party Lamps

思路:
我们来看一下四种转化方法的循环结。

  1. 改变所有的数,循环结 1 1 1。
  2. 两个数中改变一个,循环结 2 2 2。
  3. 同上,循环结 2 2 2。
  4. 三个数中改一个,循环结 3 3 3。

L C M ( 1 , 2 , 2 , 3 ) = 6 LCM(1,2,2,3)=6 LCM(1,2,2,3)=6
所以最终答案一定是每6个数为一个循环结。
那么我们就只要维护这个数列的前 6 6 6个数就可以了!
继续优化。
我们知道,任意一种改变方式按奇数次和偶数次是相同的,即你按 7 7 7次, 101 101 101次, 798132565 798132565 798132565次, 2 x + 1 2x+1 2x+1次都是一样的,而你按 6 6 6次, 198 198 198次, 354357752 354357752 354357752次, 2 x 2x 2x次都是一样的。
那么我们就对于每一种按钮枚举 0 ∼ 1 0\sim1 0∼1,表示按偶数下还是奇数下。那么如果满足:

  1. 所有的按钮按下后的奇偶性和总按下次数相同。
  2. 枚举的循环变量相加不大于总按下次数。

那么就可以进行模拟,求出最终灯(的前六位),如果符合要求,就保存这个答案,最终排序输出即可。
时间复杂度: O ( 1 ) O(1) O(1)(常数 2 4 × 6 2^4\times 6 24×6)。(或者说 O ( 2 4 × 6 ) O(2^4\times 6) O(24×6))


代码:

#include <cstdio>
#include <algorithm>
using namespace std;

int n,m,x,sum;
bool o[7],c[7];

struct answer
{
    int num[7];
}ans[30];

bool cmp(answer x,answer y)  //从小到大排序
{
    for (int i=1;i<=6;i++)
     if (x.num[i]<y.num[i]) return 1;
     else if (x.num[i]>y.num[i]) return 0;
    return 0;
}

bool check(int i,int j,int k,int l)
{
	//i^j^k^l表示最终的奇偶性,因为:
	//0表示偶数,1表示奇数
	//1^1=0,奇数+奇数=偶数
	//0^0=0,偶数+偶数=偶数
	//1^0=0^1=1,奇数+偶数=偶数+奇数=奇数
    return ((i^j^k^l)==(m&1))&&(i+j+k+l<=m);
}

void work(int i,int j,int k,int l)
{
    int a[7]={1,1,1,1,1,1,1};
    if (i) 
     for (int q=1;q<=6;q++) a[q]^=1;
    if (j)
     for (int q=1;q<=6;q+=2) a[q]^=1;
    if (k)
     for (int q=2;q<=6;q+=2) a[q]^=1;
    if (l)
     for (int q=1;q<=6;q+=3) a[q]^=1;
    for (int q=1;q<=6;q++)
     if ((o[q]&&(!a[q]))||(c[q]&&a[q])) return;  //判断是否符合要求
    sum++;
    for (int q=1;q<=6;q++)
     ans[sum].num[q]=a[q];  //记录答案
}

int main()
{
    scanf("%d%d",&n,&m);
    while (1)
    {
        scanf("%d",&x);
        if (x==-1) break;
        o[(x-1)%6+1]=1;  //open,开着的灯
    }
    while (1)
    {
        scanf("%d",&x);
        if (x==-1) break;
        c[(x-1)%6+1]=1;  //close,关着的灯
    }
    for (int i=0;i<=1;i++)
     for (int j=0;j<=1;j++)
      for (int k=0;k<=1;k++)
       for (int l=0;l<=1;l++)
        if (check(i,j,k,l)) work(i,j,k,l);
    sort(ans+1,ans+1+sum,cmp);
    for (int i=1;i<=sum;i++)
    {
        for (int j=1;j<=n;j++)
     	 putchar(ans[i].num[(j-1)%6+1]+48);
     	printf("\n");
    }
    if (!sum) puts("IMPOSSIBLE");
    return 0;
}
USACO4.1.2Fence Rails栅栏的木料解题报告 描述: 农民John准备建一个栅栏来围住他的牧场。他已经确定了栅栏的形状,但是他在木料方面有些问题。当地的杂货储存商扔给John一些木板,而John必须从这些木板中找出尽可能多所需的木料。 当然,John可以切木板。因此,一个9英尺的木板可以切成一个5英尺和一个4英尺的木料 (当然也能切成3个3英尺的,等等)。John有一把(完美的)梦之锯,因此他在切木料时,不会有木料的损失。 阅读详情

相关推荐

实战复盘:如何用ATE(自动测试设备)搞定一颗MCU的功能测试全流程

本文详细解析了如何利用ATE(自动测试设备)完成MCU功能测试的全流程,涵盖测试需求分析、测试向量生成、ATE测试程序开发及调试实战。通过真实案例分享,帮助工程师高效解决芯片测试中的常见问题,提升Functional Test的准确性和效率。

weixin_30872157的博客 485

USACO 2.2 集合(DP)

Description对于从1到N的连续整集合合,能划分成两个子集合,且保证每个集合的数字和是相等的。 举个例子,如果N=3,对于{1,2,3}能划分成两个子集合,他们每个的所有数字和是相等的: • {3} and {1,2} 这是唯一一种分发(交换集合位置被认为是同一种划分方案,因此不会增加划分方案总数) 如果N=7,有四种方法能划分集合{1,2,3,4,5,6,7},每一种分

peter_zhu01的博客 427

360加固DEX解密与ELF修复技术解析

本文深入解析了360加固APK的逆向分析技术,重点探讨了其DEX解密与ELF文件修复的核心流程。通过动态调试与Frida脚本,详细拆解了壳的启动机制、反调试绕过、自实现Linker技术,并还原了基于RC4和自定义算法的多层DEX解密过程,为移动安全研究人员提供了实用的实战分析思路。

alice7model的博客 701

USACO 2.2 集合 Subset Sums

集合 题目描述 对于从1到N (1 {3} 和 {1,2} 这是唯一一种分法(交换集合位置被认为是同一种划分方案,因此不会增加划分方案总数) 如果N=7,有四种方法能划分集合{1,2,3,4,5,6,7},每一种分法的子集合各数字和是相等的: {1,6,7} 和 {2,3,4,5} {注 1+6+7=2+3+4+5} {2,5,7} 和 {1,3,4,6} {3

闲人请进 1086

YOLOv11 网络结构详解:一文看懂 Backbone、Head、C3k2、SPPF 和 Detect 检测头

在使用 YOLOv11 进行目标检测时,我们经常会接触到或这样的模型配置文件。backbone和head分别是什么意思?ConvC3k2SPPFC2PSA这些模块分别起什么作用?P3/8、P4/16、P5/32 代表什么?为什么最后 Detect 要同时接收 3 个不同尺度的特征图?YOLOv11n、YOLOv11s、YOLOv11m、YOLOv11l、YOLOv11x 的区别在哪里?

learnerYC的博客 1810

【MATLAB强化学习工具箱】学习笔记--在Simulink环境中训练智能体Create Simulink Environment and Train Agent

Simulink中便于搭建各类动力学与控制模型,通过将原有的控制器替换为AI控制器,可以方便使用已有模型,提供增量效果。 本节的重点是如何引入Simulink模型作为env,其他的内容在之前的文章中已有说明。 以水箱模型watertank为例,如下图所示: 采用PI控制器,控制效果如下所示: 将此PI控制器替换为神经网络控制器后,系统架构如下图所示: 具体替换策略如下所示: (1)删去PID控制器; (2)增加RL Agent模块; (3)观测器模块: 观测向量为:,其中...

bear_miao的博客 1万+

USACO 2.2

前言 然而这次已经变成了动态规划 洛谷 1465 序言页码 Preface Numbering 题目 求[1…n][1\dots n][1…n]的罗马数字中各个罗马数字的个数 分析 然而竟然发现可以拆成十进制的每一位 具体是这样的 I,II,III,IV,V,VI,VII,VIII,IXI,II,III,IV,V,VI,VII,VIII,IXI,II,III,IV,V,VI,VII,VIII,...

lemondinosaur的博客 198

机器学习参数寻优:方法、实例与分析

机器学习模型的性能很大程度上依赖于其参数的选择。参数寻优(Hyperparameter Tuning)是提升模型表现的关键步骤之一。本文将详细介绍主流的参数寻优方法,包括网格搜索(Grid Search)、随机搜索(Random Search)、贝叶斯优化(Bayesian Optimization)、和超参数优化库(如Optuna和Hyperopt)等,并探讨它们的优缺点及适用场景。

甜盐的博客 2841

【USACO2.2.2】集合

水题,直接背包问题的方式得出所有数字加起来和的一半的解的数量,然后除以二即可。 证明略……  同时没懂为何别人的程序那么长,而且为毛我的内存又比别人多好几倍? PS:其实unsigned int就够用了,别人说要long long,其实用不着。 但是为毛我还是要更多的内存?还是多好几倍 #include #include using namespace std; int n;

ACMer不要报考高校代码为13627的移通学院! 576

微软登录OAuth 2.0授权流程

OAuth 2.0是一个关于授权的开放网络标准,它允许第三方应用获取用户数据,是目前最流行的授权机制。微软身份平台支持OAuth 2.0授权码流程,使得客户端应用程序能够获得对受保护资源(如网络API)的授权访问。这一流程在保障用户数据安全的前提下,实现了应用的便捷登录与数据共享。当用户在一个支持OAuth 2.0的应用上,希望使用微软账号进行登录时,OAuth 2.0授权流程即被触发。

qq_36569837的博客 4086

华为OD机考双机位C卷 - 信道分配(Java & Python& JS & C/C++ & GO )

华为OD机考双机位C卷 - 信道分配

算法大师! 453

[USACO2.2]集合 Subset Sums解析

题目链接 题意 给出 1∼n 的连续整数集合,求划分成两个和相等的子集合的方案数,如果不能划分,则输出0。 题目分析 【01背包问题】 定义dp[i][j]状态为:前 i 个数字,和为 j 的方案数。 状态转移: j < i (不能选第i个) :dp[i][j] ...

C++ static类成员 869

基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的农作物害虫检测系统(深度学习模型+UI界面+训练数据集)

随着人工智能技术在农业领域的深入应用,基于深度学习的害虫检测系统已成为智慧农业的重要组成部分。本文详细介绍了一种基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的农作物害虫检测系统,涵盖算法原理、数据集构建、模型训练、系统实现及完整代码。该系统能够实时检测并识别多种农作物害虫,为农业生产提供精准的病虫害监测解决方案。

YOLO 273

【USACO3.2】解题报告

USACO3.2的沙雕解题报告 :)

stoorz 431

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

【USACO2.4】解题报告

前言 好久没有刷USACOUSACOUSACO的题目了。这个合集也咕咕咕了。 最近终于从JZOJJZOJJZOJ和比赛中脱过身来,补一下坑。 其实前面几道题好早就AAA了,主要是最后一道模拟一直不想做。做了之后才发现挺简单的。也就用了洛谷的8个下载测试点而已。 本章主要考察搜索+最短路。还是处于基础阶段。 USACOUSACOUSACO:http://train.usaco.org/ 2.4.2...

stoorz 637

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

【USACO1.2】解题报告

前言 以后将会不定期刷USACO的题目。每做完一小章会写一份解题报告。这一小章里面较简单或者并不是很重要的题目就会直接放在里面。而比较重要的题目就会单独写博客,在这里面放链接。 这一章很简单,全部都是很基础的题目。就直接在这里面一笔带过。 USACO:http://train.usaco.org 1.2.1.Submitting Solutions 思路: 没啥好说的。 代码: /* ID:ss...

stoorz 483

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

USACO1.2 Name That Number 解题报告

解题思考顺序: Attempt:很简单的把字典读进去了顺序查找,然后又很天真的把数字用递归进行了全排列,自己在本机上实验的结果很理想。。可是悲剧的就是严重超时! Attempt:后来试着不用递归求出全排列,貌似还是很困难的。。卡住了很久很久。。至今没有编出来,还是代码能力不行 Attempt:我在别人的解题报告中也发现了有同样超时的问题,他也试过,二分查找字典也是很慢的,同样超时。。。

Panda_Ming 616

【USACO2.1】解题报告

前言 USACO2.1主要内容是图论。其中有几道题是要用深搜做的。而另外几道题则是利用模拟的方法来完成简单图论。 总体来说难度还是比较小的,算是最基础的算法吧。 UASCO:http://train.usaco.org 2.1.3.The Castle 题解 2.1.4.Ordered Fractions 思路: 可以枚举分子和分母,然后判断他们的最小公约数是不是111(其实就是判断是否互质)...

stoorz 292

USACO3.2.6 香甜的黄油 解题报告

【问题描述】        农夫John发现做出全威斯康辛州最甜的黄油的方法:把糖放在一片牧场上,他知道N(1   农夫John很狡猾。像以前的巴甫洛夫,他知道他可以训练这些奶牛,让它们在听到铃声时去一个特定的牧场。他打算将糖放在那里然后下午发出铃声,以至他可以在晚上挤奶。    农夫John知道每只奶牛都在各自喜欢的牧场(一个牧场不一定只有一头牛)。给出各头牛在的牧场和牧

cqyz_holiday的博客 1696

【USACO2.3】解题报告

前言 本章主要是动态规划,但是其中几道题的方法比较多,我采用了其他的方法。 题目已经开始变难,有几道题还特别值得思考。已经达到普及T3/T4T3/T4T3/T4水平。 USACO:http://train.usaco.org/ 2.3.1.Longest Prefix 博客地址博客地址博客地址 2.3.2.Cow Pedigrees 思路: 这道题还是很有难度的。 很明显是一个DPDPDP,但...

stoorz 380

USACO2.2.1 Preface Numbering 序言页码 解题报告(模拟)

Description   一类书的序言是以罗马数字标页码的。传统罗马数字用单个字母表示特定的数值,以下是标准数字表: I 1 L 50 M 1000 V 5 C 100 X 10 D 500 最多3个同样的可以表示为10n的数字(I,X,C,M)可以连续放在一起,表示它们的和: III=3 CCC=300 可表示为5x10n的字符(V,L,D)从不连续出现。 除了下一...

bestsort 376

USACO 3.3.2 Shopping Offers解题报告

写在前面:因为之前没写的C++的USACO Training的解题报告太多……所以就不写了,要是想要代码可以联系我:xiedong_1993@foxmail.com 这题就是传说中的五维背包,其实写起来难度不大。但是我写的时候可以说是遇到了重重困难。因为我对C++的掌握还不如Pascal,所以很多东西写的不是很熟。这题有一个很大的问题就在于,最后有用的只有五种物品,但是物品的编号却又很...

diekang6987的博客 272

USACO2.4.1 The Tamworth Two 两只塔姆沃斯牛 解题报告(模拟)

2.4.1 The Tamworth Two 两只塔姆沃斯牛 Time Limit: 1 Sec  Memory Limit: 64 MB Submit: 18  Solved: 14 [Submit][Status][Discuss] Description 两只牛在森林里故意走丢了。农民John开始用他的专家技术追捕这两头牛。你的任务是模拟他们的行为(牛和John)。 追击在10x10的...

bestsort 478

USACO 3.2解题思路报告

Factorials 求n!最后面的非零位。O(n)模拟,为防止溢出,每乘一次都要先除去末尾的零,然后模100000,最后输出最后一位即可。Stringsobits 求出长度为N(开头可以是0)且1的个数不超过L的二进制串中第k小的串。f[i][j]表示长度为i且1的个数不超过j的串的数量; 边界情况:f[i][0]=1(1<=i<=N),f[0][i]=1(1<=i<=L),f[i][j]=

SmallSXJ的博客 483

USACO 2.4.2 穿越栅栏(原题) 解题报告

【问题描述】        FJ搭建了一个巨大的用栅栏围成的迷宫。幸运的是,他在迷宫的边界上留出了两段栅栏作为迷宫的出口,并且从迷宫中的任意一点都能找到一条走出迷宫的路。给定迷宫的宽 W 及长 H 和这个迷宫,然后计算从迷宫中最“糟糕”的那一个点走出迷宫所需的最少步数。         【输入格式】        第一行: W和H(用空格隔开)    第二行至第2*H+1行:  每

cqyz_holiday的博客 935

USACO Section1.2 Greedy Gift Givers 翻译&解题报告

Task 'gift1': Greedy Gift GiversA group of NP (2 ≤ NP ≤ 10) uniquely named friends has decided to exchange gifts of money. Each of these friends might or might not give some money to some or all of th...

竹喧的博客 729
上一篇: 【洛谷P1006】传纸条【DP】
下一篇: 2018NOIP普及组 划水记
stoorz1023
博客等级 码龄9年 101粉丝 595原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值