AtCoder abc165 - AtCoder Beginner Contest 165

(注:上图真实,未F12)

第一次AK ABC,写个题解纪念一下吧

AtCoder比赛页面传送门

A - We Love Golf

洛谷题目页面传送门 & AtCoder题目页面传送门

给定\(a,b,c\),问区间\([b,c]\)内是否存在整数\(x\)使得\(a\mid x\)

\(c\in[1,1000],1\leq a\leq b\leq1000\)

没什么可说的,直接跑一遍\(b\sim c\)判断一下即可。

代码(现场代码,下同):

/*
读题不规范,爆零两行泪。
数据不清空,爆零两行泪。
多测不读完,爆零两行泪。
边界不特判,爆零两行泪。
贪心不证明,爆零两行泪。
D P 顺序错,爆零两行泪。
大小少等号,爆零两行泪。
变量不统一,爆零两行泪。
越界不判断,爆零两行泪。
调试不注释,爆零两行泪。
溢出不 l l,爆零两行泪。
*/
#include<bits/stdc++.h>
using namespace std;
int main(){
	int a,b,c;
	cin>>a>>b>>c;
	for(int i=b;i<=c;i++)if(i%a==0)return puts("OK"),0;
	puts("NG");
	return 0;
}

B - 1%

洛谷题目页面传送门 & AtCoder题目页面传送门

原有\(100\)円,每年增加\(1\%\),不足\(1\)円的零头被抛弃。问多少年后能\(\geq n\)円。

\(n\in\left[101,10^{18}\right]\)

直接暴力,一开始\(100\),每次\(\times 1.01\)并下取整直到\(\geq n\),顺便计个次。

观察样例可发现,做多增加\(3760\)次,不用担心TLE。

代码:

/*
读题不规范,爆零两行泪。
数据不清空,爆零两行泪。
多测不读完,爆零两行泪。
边界不特判,爆零两行泪。
贪心不证明,爆零两行泪。
D P 顺序错,爆零两行泪。
大小少等号,爆零两行泪。
变量不统一,爆零两行泪。
越界不判断,爆零两行泪。
调试不注释,爆零两行泪。
溢出不 l l,爆零两行泪。
*/
#include<bits/stdc++.h>
using namespace std;
int main(){
	long long n;
	cin>>n;
	long long now=100;
	for(int i=1;;i++){
		now=1.01*now;
		if(now>=n)return cout<<i,0;
	}
	return 0;
}

C - Many Requirements

洛谷题目页面传送门 & AtCoder题目页面传送门

给定\(n,m,s\)\(s\)个四元组,第\(i\)个为\((a_i,b_i,c_i,d_i)\),求在所有满足\(1\leq lis_1\leq lis_2\leq\cdots\leq lis_n\leq m\)的长度为\(n\)的整数序列\(lis\)中,最大的\(\sum\limits_{i=1}^s[lis_{b_i}-lis_{a_i}=c_i]d_i\)

\(n\in[2,10],m\in[1,10],s\in[1,50]\)

考虑枚举所有的\(lis\)算答案并取最大值。看起来满足条件的\(lis\)的数量大概是\(\mathrm O(m^n)\)级别的,但其实绝大多数每个数\(\in[1,m]\)、长度为\(n\)的整数序列都不满足条件。考虑算出满足条件的\(lis\)的数量最大是多少。

显然,当\(n,m\)都最大时,数量最大。于是我们写这样一个程序跑一跑:

#include<bits/stdc++.h>
using namespace std;
#define rep(i,l) for(int i=l;i<=10;i++)
int main(){
	int ans=0;
	rep(a,1)rep(b,a)rep(c,b)rep(d,c)rep(e,d)rep(f,e)rep(g,f)rep(h,g)rep(i,h)rep(j,i)ans++;
	cout<<ans;
	return 0;
}

跑出来当\(n=m=10\)时数量只有\(92378\)。这时候就可以放心大胆地暴搜了,对于一个\(lis\)计算答案的时间复杂度为\(\mathrm O(s)\)

代码:

/*
读题不规范,爆零两行泪。
数据不清空,爆零两行泪。
多测不读完,爆零两行泪。
边界不特判,爆零两行泪。
贪心不证明,爆零两行泪。
D P 顺序错,爆零两行泪。
大小少等号,爆零两行泪。
变量不统一,爆零两行泪。
越界不判断,爆零两行泪。
调试不注释,爆零两行泪。
溢出不 l l,爆零两行泪。
*/
#include<bits/stdc++.h>
using namespace std;
const int N=10,S=50;
int n,m,s;
int a[S+1],b[S+1],c[S+1],d[S+1];
int lis[N+1];
int ans;
void dfs(int x=1,int now=1){
	if(x==n+1){
		int res=0;
		for(int i=1;i<=s;i++)if(lis[b[i]]-lis[a[i]]==c[i])res+=d[i];
		ans=max(ans,res);
		return;
	}
	lis[x]=now;
	for(int i=now;i<=m;i++)dfs(x+1,i);
}
int main(){
	cin>>n>>m>>s;
	for(int i=1;i<=s;i++)cin>>a[i]>>b[i]>>c[i]>>d[i];
	dfs();
	cout<<ans;
	return 0;
}

猜你喜欢

转载自www.cnblogs.com/ycx-akioi/p/AtCoder-abc165.html
今日推荐