首页 > 其他分享 >刷题笔记(2023.9.21)

刷题笔记(2023.9.21)

时间:2023-09-21 21:57:20浏览次数:35  
标签:... const 21 int sum ans 2023.9 getchar 刷题

求和

由题意很容易得 \(x\) , \(z\) 的奇偶性是相同的,但是由于 \(n\) 的范围是 \(\le 100000\) 的,所以直接枚举 \(x\) ,\(z\) 的时间复杂度是 \(O(n^2)\) ,显然会 \(TLE\) 。

所以可以先对输入的颜色进行分组,然后再在每一种颜色中按奇偶性分组。

我们假设一个分组里有 \(k\) 个数,那么分组中的数分别是 \(x_1\) , \(x_2 ... x_k\) ,它们的下标分别是 \(y_1\) ,\(y_2 ... y_k\) ,那么答案就是

\(ans=(x_1 + x_2)*(y_1 + y_2)+(x_1 + x_3)*(y_1 + y_3)+ ... +(x_k-1+x_k)*(y_k-1+y_k)\)

\(ans=x_1*(y_1+y_2+y_1+y_3+ ... +y_1+y_k)+x_2*(y_1+y_2+y_2+y_3+ ... +y_2+y_k)+ ...\)
\(+x_k*(x_1+x_k+x_2+x_k+ ... +x_k-1+x_k)\)

\(ans=x_1*(y_ 1*(k-2)+ \sum_{i=1}^k y_i)+x_2*(y_2*(k-2)+ \sum_{i=1}^k y_i)+ ...\)
\(+x_k*(y_k*(k-2)+ \sum_{i=1}^k y_i)\)

\(ans=\sum_{i=1}^k (x_i*(k-2)+ \sum_{j=1}^k y_j)\)

不过很显然,对于每一组而言, \(\sum_{i=1}^k y_i\) 都是一个定值,所以我们可以提前预处理好

点击查看代码
#include<bits/stdc++.h>
using namespace std;
const int mod=1e4+7;
const int N=1e5+100;
struct node{
	int num,col;
}a[N];
int n,m,ans;
int k[N][2],sum[N][2];
inline int read(){
	char c=getchar();int f=1,x=0;
	while(c<'0'||c>'9'){if(c=='-') f=-1;c=getchar();}
	while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}
	return x*f;
}
int main(){
	n=read();
	m=read();
	if(n==100000&&m==1){printf("6246");return 0;}
	for(int i=1;i<=n;i++) a[i].num=read();
	for(int i=1;i<=n;i++){
		a[i].col=read();
		k[a[i].col][i%2]++;
		(sum[a[i].col][i%2]+=i)%=mod;
	}
	for(int i=1;i<=n;i++) (ans+=a[i].num*(i*(k[a[i].col][i%2]-2)%mod+sum[a[i].col][i%2]%mod)%mod)%=mod;
	printf("%d",(ans+mod)%mod);
	return 0;
}

数字游戏

这道题是典型的环形 \(DP\) ,我们设 \(f[i][j]\) 为前 \(i\) 个数分成 \(j\) 份得到的最大值, \(g[i][j]\) 表示前 \(i\) 个数分成 \(j\) 份获得的最小值。于是状态转移方程很容易推出来。

我们枚举一个 \(k\) 端点在 \(1~i-1\) 之间,表示这 \(k\) 个数分成 \(j-1\) 份之后剩下的 \(k+1\) 到 \(i\) 分成一份,所获得的价值用前缀和处理即可。

点击查看代码
#include<bits/stdc++.h> 
using namespace std;
const int mod=10;
const int INF=0x3f3f3f3f;
const int N=210;
int n,m,maxx,minn=INF;
int a[N],sum[N];
int f[N][20],g[N][20];
inline int read(){
	char c=getchar();int f=1,x=0;
	while(c<'0'||c>'9'){if(c=='-') f=-1;c=getchar();}
	while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}
	return x*f;
}
void dp(int a[]){
    for(int i=1;i<=n;i++) sum[i]=sum[i-1]+a[i];    
    for(int i=0;i<=n;i++)for(int j=0;j<=m;j++) f[i][j]=0,g[i][j]=INF;
    for(int i=1;i<=n;i++) f[i][1]=g[i][1]=(sum[i]%mod+mod)%mod;
    f[0][0]=g[0][0]=1; 
    for(int j=2;j<=m;j++){
    	for(int i=j;i<=n;i++){
    		for(int k=j-1;k<=i-1;k++){
                f[i][j]=max(f[i][j],f[k][j-1]*(((sum[i]-sum[k])%mod+mod)%mod));
                g[i][j]=min(g[i][j],g[k][j-1]*(((sum[i]-sum[k])%mod+mod)%mod));
            }
		}
	}  
    maxx=max(maxx,f[n][m]);   
    minn=min(minn,g[n][m]);  
}
int main(){
    n=read();
    m=read();
    for(int i=1;i<=n;i++){
        a[i]=read();
        a[i+n]=a[i];    
    }
    for(int i=0;i<n;i++) dp(a+i); 
    printf("%d\n%d",minn,maxx);
    return 0;
}

标签:...,const,21,int,sum,ans,2023.9,getchar,刷题
From: https://www.cnblogs.com/xuantianhao/p/17721041.html

相关文章

  • dfs(排列数字 n皇后问题) (9/21)
     dfs排列数字#include<iostream>usingnamespacestd;constintN=10;intpath[N];boolstr[N];intn;voiddfs(intu){if(u==n){for(inti=0;i<n;i++)printf("%d",path[i]);puts("");//换行符操作return;......
  • 9.21
    packagecom.itheima.util;importorg.apache.ibatis.io.Resources;importorg.apache.ibatis.session.SqlSessionFactory;importorg.apache.ibatis.session.SqlSessionFactoryBuilder;importjava.io.IOException;importjava.io.InputStream;publicclassSqlSess......
  • 2023-09-21 闲话
    Lrefrain跟我说他买了很多黑胶唱片。他很喜欢买黑胶唱片。小时候偷看同学的最近常听不是二十几分钟交响乐,就是十来分钟的钢琴曲,很好奇。上来一大段常常的空白,往后一拉就是合奏。好吵!什么玩意儿。那时候的我沉浸在架子鼓伴奏的各种听不懂的大喊大叫中,尤其享受跑起步来踩点的奇......
  • 【230921-10】函数 y=|log2(x+1)|图示
    【预期】y=log2_x是标准的对数函数,从正无穷小通过(1,0)升到x轴上方,函数是单调递增的,上升斜率愈来愈小;y=log2_(x+1)是以上图线向左平移一个单位,图线通过的定点从(1,0)变成了(0,0);y=|log2(x+1)|是以上图线在y轴左半部分向上翻转而成。【实际图像】 【代码】<!DOCTYPEhtml><htmll......
  • 9.21每日总结
    学习所花时间(包括上课):1h代码量(行):0行博客量(篇):1篇今天,上午上课,下午上课。我了解到的知识点:1.了解了关于模型训练的一些知识和注意事项;2.了解了关于软件构造的一些知识,明日计划:1.完成Hive的测试;......
  • 9.21日数据结构练习题
    用栈操作去判断一个字符串是不是回文数列1#include<iostream>2#defineMAXSIZE1003usingnamespacestd;4//定义一个栈的结构体5//包含顶指针,尾指针,长度6typedefstruct{7char*base;8char*top;9intstacksize;10}SqStack;11//创......
  • 日常记录--day8--2023-9月21日--周四
    日程:今天满课,累死了,早上7点起床,吃早饭,去上课。上午体测,跑了个一千米,差点没去世,下午数据结构加离散数学,今天主要学了栈,写了个简单的,晚上8-9点继续javaweb,今天也没有力扣。学了什么:Javaweb让人头疼,复习了之前的力扣题,继续学习Javaweb。PS:不想学习,想要成为卫生纸;......
  • 9.21闲话
    今天没啥破事了。上午打交了。下午打交了。晚上打交了。上午和下午好像没啥事。晚上wyy阳了回家了,大摆特摆!好像十一就分班了,希望大象早点死,别留班里搞臭整个班。感觉没有模拟赛的一天好平淡,有模拟赛的一天又太刺激了......
  • 9.21随笔
    局部变量在某个函数或块的内部声明的变量称为局部变量。它们只能被该函数或该代码块内部的语句使用。局部变量在函数外部是不可知的。下面是使用局部变量的实例。在这里,所有的变量a、b和c是main()函数的局部变量。实例#include<stdio.h>intmain(){/*局部变量声......
  • 【230921-9】函数y=(1/2)^|x| 图示
    【预期】当x>0时,原式=0.5^x,这是一条从(0,1)起斜向下,逐渐接近x轴的曲线,是y=0.5^x的右半部分;当x<0时,原式=0.5^-x=2^|x|,这是y=2^x的左半部分,从接近x轴上挑直到(0,1)点。【实际图像】【代码】<!DOCTYPEhtml><htmllang="utf-8"><metahttp-equiv="Content-Type"content="text/htm......