首页 > 其他分享 >iwtgm-11

iwtgm-11

时间:2023-11-03 15:12:05浏览次数:40  
标签:11 int sum iwtgm a1 init a2 total

题目链接

A.

能全买,就让剩余的总钱/全买,加上可得的糖数,总钱-这些花费
此时不能全买,就遍历一遍,算出能买的总数
再让剩余的总钱/能买的...

这样是不会T的:
设total为这一轮能买的糖果的总价格,last为之前剩下的钱,now为这一轮买完糖果后剩下的钱
now=last%total,所以now<total,(取模肯定小于模数)
now<last-total,(不然还能买),
所以now<last/2
所以是log(钱初始总数)的时间复杂度

自己写的时候还加了树状数组求前缀和,不仅没优化还T了

ll n,total,res,sum,cnt;
ll a[N];
void solve(){
    cin>>n>>total;
    for(int i=1;i<=n;i++){
        cin>>a[i];
        if(total-sum>=a[i]){
            sum+=a[i];cnt++;
        }
    }
    while(sum>0&&total>0){
        res+=total/sum*cnt;
        total%=sum;
        sum=0;cnt=0;
        for(int i=1;i<=n;i++){
            if(total-sum>=a[i]){
                sum+=a[i];cnt++;
            }
        }
    }
    cout<<res;
}

B.

把一种可能的路径情况分为两部分,
蛇形和环形,两者分开独立计算,环形又分为起点、箭头和环身
枚举蛇形的列数


看代码注释:

init_b(){//算蛇形
    //a1[]是第一行的蘑菇生长速度,a2[]是第二行的蘑菇生长速度
    int s=0;//相当于前缀和
    for(int i=1;i<=n;i+=2){//这里是两列两列算的,有其他方法能求出这个前缀也行
        s+=a1[i]*(i*2-2);//蘑菇生长速度*秒数
        s+=a2[i]*(i*2-1);//蘑菇生长速度*秒数
        b[i]=s;//走到当前列一共能采的蘑菇数
        s+=a2[i+1]*(i*2);//两列中的第二列
        s+=a1[i+1]*(i*2+1);
        b[i+1]=s;
    }
}//预处理出了从出发到当前列i一直是走蛇形所采的蘑菇数
init_S(){这里没有算秒数,只是生长速度的后缀和,继续往下看
    int s=0;//后缀和
    for(int i=n;i>=1;i--)
    s+=a1[i]+a2[i],S[n-i+1]=s;//从右往左数的S1,S2...
}
init_C1(){
    //从上面绕下去,起点在上面
    //c1[i]表示从第i列(从左往右数)开始的 
    int s=0;
    for(int i=n,l=0;i>=1;i--,l++){
        s+=S[l];//l是右边的列数,每次加的是后缀和(也就是越靠右的加的次数越多,这样秒数就体现出来了)
        s+=a2[n-l]*(l+l+1);//算的是箭头的那一格,先算的箭头,再加后缀和,从右向左的方向,那么第一行需要多的秒数也体现出来了
        c1[i]=s;//实际上这个值就是整个环形的总蘑菇数
    } 
}
init_C2(){
    //从下面绕上去
    //c2[i]表示从第i列(从左往右数)开始的 
    int s=0;
    for(int i=n,l=0;i>=1;i--,l++){
        s+=S[l];
        s+=a1[n-l]*(l+l+1);//只有这里的a1,a2换了一下 
        c2[i]=s;
    } 
}
//枚举从哪开始拐,开头看作是0,偶数向下,然后下一列就向右延伸,那么箭头位置就在第一行,是c2[]
    for(int i=0;i<=n;i++){
        //从下一列开始拐弯 
        if(i%2) ans=max(ans,b[i]+c2[i+1]+S[n-i]*(i*2));//当前列数是奇数,向上,在第一行的时候向右延伸,箭头位置在第二行,是c1[]
        else    ans=max(ans,b[i]+c1[i+1]+S[n-i]*(i*2));//因为我们是把环独立算的,事实上起点不是0,前面蛇形已经走了一些秒数,那么把环形整个提升提升i*2的秒数
    }
//主函数
#define int long long
int n,ans,a1[N],a2[N],S[N],b[N],c1[N],c2[N];
signed main(){
    cin>>n;
    for(int i=1;i<=n;i++)cin>>a1[i];
    for(int i=1;i<=n;i++)cin>>a2[i];
    init_S();
    init_b();
    init_C1();
    init_C2();
    for(int i=0;i<=n;i++){
        if(i%2) ans=max(ans,b[i]+c2[i+1]+S[n-i]*(i*2));
        else    ans=max(ans,b[i]+c1[i+1]+S[n-i]*(i*2));
    }
    cout<<ans;

C.

期望是均值,所有情况总疲惫值之和/所有情况=期望,题目求期望所有情况就是求所有情况的总疲惫值之和
可以分开算每个疲惫值出现的次数
疲惫值之和
每个点都可以是休息点或不是休息点,那么就有2^(n-1)种情况
考虑每个疲惫值出现的次数,
如a[1],1号点一定是a[1],那么个数有2^(n-1),
然后后面的(n-1)个点每一个点都可以是a[1],固定一个点取a[1]后,剩下的(n-2)个点(可以取a[1]或者接着前一个的疲惫),有2(n-2)种情况,这些情况里都包括了这个a[1],都要算一个次数,然后固定点的取值范围有n-1个,就是(n-1)*2(n-2)。
注意:重复的是休息点的状态,但是我们计算的是这个固定点的次数,有多少种情况这个固定点就要加多少次
如果一种状态里有两个a[1],也就是会有两个固定点,一个固定点计算这种状态时只加了它自己的一个,所以状态重复没有关系

对于a[2],一定要连续的两个点,就是说有两个点是固定的,(1、2),开头选了1,2两个点,剩下的n-2个点任取,有2^(n-2)。
1号点永远是a[1]不变,剩n-1个点,两个连续的点有n-2组,固定一组,剩n-3个点任取,就是2(n-2)+(n-2)*2(n-3)

推广:a[i]的个数为2^(n-i)+(n- i)2^(n-i-1)
设a[i]的个数为Ni,答案为Ni
ai之和

ll p=998244353;
ll a[N],pw[N];
void init(){
    pw[0]=1;
    for(int i=1;i<N;i++){
        pw[i]=pw[i-1]*2%p;
    }
}
void solve(){
    ll n;cin>>n;
    init();
    for(int i=1;i<=n;i++)cin>>a[i];
    ll ans=0;
    for(int i=1;i<=n;i++){
        ll tmp=(pw[n-i]+(n-i)*pw[n-i-1])%p;
        tmp=(tmp*a[i])%p;
        ans=(ans+tmp)%p;
        //ans=add(ans,add(pw[n-i],(n-i)*pw[n-i-1]%p)*a[i]%p);
    }
    cout<<ans;
}

标签:11,int,sum,iwtgm,a1,init,a2,total
From: https://www.cnblogs.com/wwww-/p/17806656.html

相关文章

  • oracle异常问题ORA-01116、ORA-01110、ORA-27041:无法打开文件
    select*fromdba_data_files;ORA-01116:打开数据文件3出错ORA-01110:数据文件3:'/home/oracle/dmpfile20200903/test_xfh_db.dbf'ORA-27041:无法打开文件Linux-x86_64Error:2:NosuchfileordirectoryAdditionalinformation:301116.00000-"errorinopening......
  • 给Windows11开启休眠功能
      休眠功能明显比睡眠功能好用,还不惧怕断电,不知道为什么微软要把这个功能默认关闭。  开启方法:  1.使用管理员资格启动命令提示符  2.使用如下命令即可开启:powercfg.exe/hibernateon  使用后休眠就回来了。 ......
  • 2023.11.3 做题记录
    CF349B*1700\(Igor\)深深爱上了\(Tanya\).现在,\(Igor\)想表达他的爱意,他便在\(Tanya\)家对面的墙上写下一串数字.\(Igor\)认为,数字写得越大,\(Tanya\)越喜欢他.不幸的是,他只有\(v\)升油漆,每个数字都会花掉一定的油漆\(a_i\).\(Igor\)不喜欢\(0\)所以数中不会出......
  • C#.NET 国密SM4 CBC 对称加解密 与JAVA互通 ver:20231103
    C#.NET国密SM4CBC对称加解密与JAVA互通ver:20231103 .NET环境:.NET6控制台程序(.netcore)。JAVA环境:JAVA8,带maven的JAVA控制台程序。 简要解析:1:加密的KEY、明文等输入参数都需要string转byte[],要约定好编码,如:UTF8。2:加密后的输出参数:byte[],在传输时需要转......
  • NU1102 找不到版本为(=5.0.0-dev)的包 Microsoft.NETCore.App.Host.win-x64
    异常: 原因:.NetCore3.0之后的版本,默认情况下项目在生成时,会自动生成与运行时版本相同的可执行文件(exe<Windows下>),它是需要对应版本的一个dotnet-apphost-pack包支持。  解决方法:1.下载安装dotnet-apphost-pack包 2.禁用生成可执行文件,只要.dll文件在项目文件.csp......
  • 2023年11月最新全国省市区县和乡镇街道行政区划矢量边界坐标经纬度地图数据 shp geojs
    发现个可以免费下载全国 geojson 数据的网站,推荐一下。支持全国、省级、市级、区/县级、街道/乡镇级以及各级的联动数据,支持导入矢量地图渲染框架中使用,例如:D3、Echarts等geojson数据下载地址:https://geojson.hxkj.vip该项目github地址:https://github.com/TangSY/echarts-m......
  • 投资者查外汇平台必备利器"FX110 APP" !
    随着全球外汇市场的不断扩大,外汇交易者对于安全、可靠的交易平台的需求也日益增长。在这个背景下,“FX110APP”成为数千万外汇交易者的信赖之选,“FX110APP”移动客户端一直以来都是外汇行业的重要领头标杆产品,以“外汇交易平台资料查询、监管查询、牌照查询、风险曝光、信用评价......
  • 2023.11《地球ONLINE》版本大更新!!!
    2023.11《地球ONLINE》版本大更新!!!欢迎来到全宇宙最大规模沙盒游戏地球online,这款游戏已经运行长达46亿年,在线人数已多达80多亿,目前设立“197个服务器,目前游戏内存占用率仍未达到极限,且下载速度极快,创建新号条件为“会员邀请制”,仅需10个月就能登录游戏,新玩家在登录游戏后便来......
  • 11月3每日打卡
    .NET实验:编写一个控制台应用程序,输入三角形或者长方形边长,计算其周长和面积并输出。编写一个控制台应用程序,可根据输入的月份判断所在季节。编写程序,用while循环语句实现下列功能:有一篮鸡蛋,不止一个,有人两个两个数,多余一个,三个三个数,多余一个,再四个四个地数,也多余一个,请问这......
  • 11类型别名和自定义类型
    Go语言中没有“类”的概念,也不支持“类”的继承等面向对象的概念。Go语言中通过结构体的内嵌再配合接口比面向对象具有更高的扩展性和灵活性。类型别名和自定义类型自定义类型在Go语言中有一些基本的数据类型,如string、整型、浮点型、布尔等数据类型,Go语言中可以使用type关键......