ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

NOI Online 2020 #1(入门组) 题解

2020-07-05 11:01:56  阅读:433  来源: 互联网

标签:return NOI int 题解 else python 2020 solve dp


前言

两道紫题(省选难度)QAQ,而且时限卡得很紧,享受爆零的快乐

T1 文具订购

题目传送门
根据题意,直接打暴力。枚举\(a,b\),再根据订购原则更新答案(注意这里\(c\)就不用枚举了,可通过\(a,b\)计算)。
时间复杂度\(O(n^2)\),对于\(0\leqslant n\leqslant 10^5\)的数据,开个氧气可以水过

//Author: stdout
#include <bits/stdc++.h>
#define inf 0x3f3f3f3f
using namespace std;
inline int qaq(int x,int y,int z)  //三个数的最小值
{
	int ans=inf;
	if(x<ans) ans=x;
	if(y<ans) ans=y;
	if(z<ans) ans=z;
	return ans;
}
int main()
{
	//freopen("order.in","r",stdin);
	//freopen("order.out","w",stdout);
	int n,m=-1,s=-1,a=-1,b=-1,c=-1;  //s是最大物品总数,m是最大的a,b,c中的最小值
	cin>>n;
	for(int i=n/7;i>=0;--i)
		for(int j=n/4;j>=i;--j)
		{
			int k=n-7*i-4*j;  //计算c的总价
			if(k%3) continue;  //c的数量不是整数,下一个
			k/=3;int t=qaq(i,j,k);  //获取最小值和c的数量
			if(t>m)
				a=i,b=j,c=k,m=t,s=i+j+k;
			else if(t==m&&i+j+k>s)
				a=i,b=j,c=k,s=i+j+k;
		}
	if(a==-1&&b==-1&&c==-1) cout<<"-1";  //如果没有解
	else cout<<a<<" "<<b<<" "<<c; 
	return 0;
}

T2 跑步

题目传送门
声明:由于本蒟蒻水平菜,以下代码仅供娱乐,请大佬们自行跳过 会正解的大佬也可以教教我qwq
这题本蒟蒻开始用爆搜做,结果妥妥地T飞了(30分QAQ)
如果你输出前15个答案,你会发现答案似乎有些规律,

1,1,2,3,5,7,11,15,22,30,42,56,77,101,135

通过一个叫oeis的神奇网站(专门用来找数列规律)可以发现这是序列A000041
通过底下的PROG部分可以找到生成数列的代码(python): python大法好

def A000041(n):
    if n == 0: return 1
    S = 0; J = n-1; k = 2
    while 0 <= J:
        T = A000041(J)
        S = S+T if is_odd(k//2) else S-T
        J -= k if is_odd(k) else k//2
        k += 1
    return S 

python党直接cv就行了,而我们还需要转换一下

int solve(int x)
{
	if(!x) return 1;
	int s=0,j=x-1,k=2;
	while(j>=0)
	{
		int t=solve(j);
		if((k/2)&1) s+=t;
		else s-=t;
		if(k&1) j-=k;
		else j-=k/2;
		++k;
	}
	return s;
}

这样还是有递归,复杂度较高.我们还需要再优化一下,把递归变成dp(别忘了加模数),时间复杂度变为\(O(n)\).直接上AC代码

#include <bits/stdc++.h>
using namespace std;
const int N=1e5+5;
int dp[N];
void solve(int n,int p)
{  //一通瞎改
	dp[0]=1;
	for(int i=1;i<=n;++i)
	{
		int j=i-1,k=2;
		while(j>=0)
		{
			if((k/2)&1) dp[i]=(dp[i]+dp[j])%p;
			else dp[i]=(dp[i]-dp[j]+p)%p;
			if(k&1) j-=k;
			else j-=k/2;
			++k;
		}
	}
}
int main()
{
	int n,p;
	//freopen("running.in","r",stdin);
	//freopen("running.out","w",stdout);
	cin>>n>>p;
	solve(n,p); 
	cout<<dp[n];
	return 0;
}

T3

咕咕咕

标签:return,NOI,int,题解,else,python,2020,solve,dp
来源: https://www.cnblogs.com/stdout/p/13237581.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有