首页 > 其他分享 >NOIP2014普及组试题题解

NOIP2014普及组试题题解

时间:2023-05-24 21:25:06浏览次数:83  
标签:NOIP2014 return 试题 int 题解 ll long dfs using

1.珠心算测验

代码:

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N = 2e4+39+7;
int mp[N],n,a[N],ans=0;
int main(){
	cin>>n;
	for(int i=1;i<=n;i++)cin>>a[i];
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			if(a[i]!=a[j]){
				mp[a[i]+a[j]]=1;
			}
		}
	}
	for(int i=1;i<=n;i++){
		if(mp[a[i]]){
			ans++;
		}
	}
	cout<<ans;
	return 0;
}

  

解题思路:

用一个哈希表统计和即可

 

2.比例简化

代码:

#include<bits/stdc++.h>
#define ll long long
using namespace std;
int gcd(int a,int b){
	if(!b)return a;
	return gcd(b,a%b);
}
int a,b,l,ans1,ans2;
int main(){
	cin>>a>>b>>l;
	ans1=l;
	ans2=1;
	for(int i=1;i<=l;i++){
		for(int j=1;j<=l;j++){
			if(gcd(i,j)==1){
				if(i*b>=a*j&&ans1*j>=ans2*i){
					ans1=i;
					ans2=j;
				}
			}
		}
	}
	cout<<ans1<<' '<<ans2;
	return 0;
}

  

解题思路:

判断i,j是否互质,且比值大于等于a/b即可

注意事项:

1.由于c++中实数操作可能会丢失精度,所以要把a/b>c/d换成a*d>b*c

 

3.螺旋矩阵

代码:

#include<bits/stdc++.h>
#define ll long long
using namespace std;
int n,x,y;
int dfs(int n,int x,int y){
	if(x==1)return y;
	if(y==n)return n+x-1;
	if(y==1)return 4*n-2-x;
	if(x==n)return 3*n-y-1;
	return dfs(n-2,x-1,y-1)+4*(n-1);
}
int main(){
	cin>>n>>x>>y;
	cout<<dfs(n,x,y);
	return 0;
}

  

解题思路:

由矩阵可以看出,分5种情况:第一种,x=1,直接返回y

                                                 第二种,x=n,可以找到规律,是3n-y-1

                                                 第三种,y=1,可以找到规律,是4n-x-2

                                                 第四种,y=n,可以找到规律,是n+x-1

                                              第五种,在中心,返回dfs(n-2,x-1,y-1)+4(n+1),向内递进一层

最终可以得出答案

 

4.子矩阵

代码:

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N = 39+7;
int n,m,r,c,a[N],num[N][N],sol=1e9,w[N],g[N][N],dp[N][N];
void init(){
	for(int i=1;i<=m;i++){
		w[i]=0;
		for(int j=1;j<r;j++)w[i]+=abs(num[a[j]][i]-num[a[j+1]][i]);
	}
	for(int i=1;i<=m;i++){
		for(int j=i+1;j<=m;j++){
			g[i][j]=0;
			for(int k=1;k<=r;k++){
				g[i][j]+=abs(num[a[k]][i]-num[a[k]][j]);
			}
		}
	}
}
int dpp(){
	memset(dp,0x7f,sizeof(dp));
	dp[0][0]=0;
	for(int k=1;k<=c;k++){
		for(int i=k;i<=m;i++){
			for(int j=k-1;j<i;j++){
				dp[i][k]=min(dp[i][k],dp[j][k-1]+w[i]+g[j][i]);
			}
		}
	}
	int ans=dp[c][c];
	for(int i=c+1;i<=m;i++)ans=min(ans,dp[i][c]);
	return ans;
}
void dfs(int tr){
	if(tr>r){
		
		init();
		sol=min(sol,dpp());
		return;
	}
	for(int i=a[tr-1]+1;i<=n;i++){
		a[tr]=i;
		dfs(tr+1);
	}
}
int main(){
	cin>>n>>m>>r>>c;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			cin>>num[i][j];
		}
	}
	dfs(1);
	cout<<sol;
	return 0;
}

  

解题思路:

暴力枚举行的组合是C(n,r),在使用dp去计算列的最小值,每次取最小值即可,时间复杂度是O(C(n,r)*m3)

标签:NOIP2014,return,试题,int,题解,ll,long,dfs,using
From: https://www.cnblogs.com/zhanghx-blogs/p/17429533.html

相关文章

  • 常见问题解决 --- Failed to build android app at server - class file for android.
    问题原因  这个错误主要是LocalBroadcastManager这个类被弃用了,而在库或者sdk中使用到了。解决办法build.gradle文件中添加implementation'com.android.support:support-v4:30.4.1'gradle.properties添加android.enableJetifier=true......
  • abc260_f Find 4-cycle 题解
    Find4-cycle题意有一个\(s+t\)个点\(m\)条边的简单无向图\(G\)。点标号为\(1\cdotss+t\),边标号为\(1\cdotsm\)。第\(i\)条边连接点\(u_i\)和\(v_i\)。如果\(G\)中包含一个大小为\(4\)的简单环,选择任意一个并按任意顺序输出环上的\(4\)个点。若不存......
  • abc260_e At Least One 题解
    AtLeastOne题意给定一个整数\(m\)和\(n\)对数\((a_i,b_i)\),我们定义一个\(f(x)\)函数表示满足以下要求的整数序列数量:整数序列为\((1,2,3\cdotsm)\)的一个子段且序列长度为\(x\)。对于\(1\leqslanti\leqslantn\),满足\(a_i\)或者\(b_i\)在整数序列......
  • Element 表格固定列横向滚动条无法拖动的问题解决
    在Element-UI中,当对表格列进行固定后,底部的横向滚动条就无法拖动了,主要的问题就是固定区域盖住了横向滚动条。方案一:修改el-table__body-wrapper样式的层级,随便设个层级就可::v-deep.el-table__body-wrapper{z-index:2}//加了fixed之后失效::v-deep.el-table__fi......
  • abc273_e Notebook 题解
    Notebook题意有\(q\)次操作。现在你有一个空序列\(a\)和一本\(10^9\)页的笔记本,每页纸上都有一个空序列。每次操作是以下四种中的一种:ADDx,表示在\(a\)的末尾插入一个整数\(x\)。DELETE,表示删除\(a\)的末尾的一个数,如果\(a\)序列为空则什么也不干。SAVEy,表......
  • Game on Paper 题解
    题目传送门一道模拟题。如果每涂一个格子就判断整个矩阵,那时间复杂度显然会炸。我们每涂一个格子,影响的应该只是以这个格子为中心的\(3\times3\)矩阵,判断以这些点为中心的话会不会涂出\(3\times3\)的矩阵即可。Code#include<bits/stdc++.h>#definelllonglong#d......
  • 2023(ICPC)江西省赛I题题解
    I.Tree题意:两种操作,操作1:将一棵树一条路径上的边权异或上一个数,操作2:或者询问一个点周围所有边权的异或和。题解:首先,异或有一个性质A⨁A=0⇒A⨁B⨁A=B在进行操作一时,对X到Y的简单路径上的每一条边权异或,会是这样的情况X_w1_Z_w2_P_w3_Y,根据上面......
  • 测试题2 (对象锁-)
         ......
  • CF1196F K-th Path 题解 floyd
    题目链接:https://codeforces.com/problemset/problem/1196/F题目大意:给定一个包含\(n\)个节点\(m\)条边的无向图(\(n,m\le2\cdot10^5\))。图中任意两点之间(如果连通的话)都存在一条最短路(节点\(i\)到它自己不算最短路,\(i\)到\(j\)的最短路和\(j\)到\(i\)的最短......
  • JOISC 2022 题解
    JOISC2022Day1监狱Jail首先我们发现操作一定是给所有人排序,然后按照顺序直接从\(s_i\)挪到\(t_i\),要求是对于\(i\),所有在它之前挪的\(t\)不能在\(s_i\tot_i\)上,所有在它之后挪的\(s\)不能在\(s_i\tot_i\)上。有了这个条件我们就可以\(O(n^2)\)建图。但是这样......