0504南京理工模拟(十)

题目列表:
在这里插入图片描述

第四题

P1678 烦恼的高考志愿
考点:二分查找的变形
数组中查找与x距离绝对值最近的数

/*-------4---------*/
#include<bits/stdc++.h>
using namespace std;
int m,n,a[100000],b[100000];
int bSearch(int A[],int left,int right,int x){
	int mid,temp=1000000;
	while(left<=right){
		mid=(left+right)/2;
		if(A[mid]==x) return 0;
		else if(A[mid]>x){
			if(abs(A[mid]-x)<temp){
				temp=abs(A[mid]-x);
			}
			right=mid-1;
		}else{
			if(abs(A[mid]-x)<temp){
				temp=abs(A[mid]-x);
			}
			left=mid+1;
		}
	}
	return temp;
}
int main(){
// 	freopen("in.txt","r",stdin);
	scanf("%d%d",&m,&n);
	for(int i=1;i<=m;i++){
		//a[i]学校 
		scanf("%d",&a[i]);
	}
	for(int i=1;i<=n;i++){
		//b[i]学生 
		scanf("%d",&b[i]);
	}
	sort(a+1,a+1+m);
	sort(b+1,b+1+n);
	int ans=0;
	for(int i=1;i<=n;i++){
		ans+=bSearch(a,1,m,b[i]);
	}
	printf("%d",ans);
	return 0;
}

第五题

考点:dp,完全背包问题
贪心算法,WA了一个点,才发现这个题目原来是要用dp
我自己想的一个检测点:
10 4
8 24
7 20
6 15
3 7
答案是27,贪心结果是24

//------贪心算法---WA一个点

#include<bits/stdc++.h>
using namespace std;
struct node{
	int t,v;
	double e;
}a[10010];
int cmp(node A,node B){
	return A.e>B.e;
}
int main(){
// 	freopen("in.txt","r",stdin);
	int t,m,ans=0;
	scanf("%d%d",&t,&m);
	for(int i=1;i<=m;i++){
		scanf("%d %d",&a[i].t,&a[i].v);
		a[i].e=1.0*a[i].v/a[i].t;
	}
	sort(a+1,a+1+m,cmp);
	int leftTime=t;
	for(int i=1;i<=m;i++){
		while(leftTime>=a[i].t){
			ans+=a[i].v;
			leftTime-=a[i].t;
		}
	}
	printf("%d",ans);
	return 0;
}

正解如下:

//---二维dp[i][j]会出现超内存限制
//------只能用一维dp--------
#include<bits/stdc++.h>
using namespace std;
struct node{
	int t,v;
	double e;
}a[10010];
int cmp(node A,node B){
	return A.e>B.e;
} 
int dp[100001];
int main(){
//  freopen("in.txt","r",stdin);
// 	freopen("out.txt","w",stdout);
	int t,m; 
	scanf("%d%d",&t,&m);
	for(int i=1;i<=m;i++){
		scanf("%d %d",&a[i].t,&a[i].v);
	}
	for(int i=1;i<=m;i++){
		for(int j=a[i].t;j<=t;j++){
		    //j必须从左往右遍历
			dp[j]=max(dp[j],dp[j-a[i].t]+a[i].v);
		} 
	}
	printf("%d",dp[t]);
	return 0;
}

第六题

P1162 填涂颜色
考点:深搜/广搜
①从矩阵外(0,0)点开始搜索,碰到1停止搜索,返回。至于为什么是从矩阵外开始搜索:因为比如若从矩阵内(1,1)开始,当(1,1)是1,则程序会在第一步停止。
②可以利用visit[i][j]表示从(0,0)是否可以访问到,若可以,则是“1圈”外面,不改变原矩阵的数值,当visit[i][j]==0不能访问到,则是圈内,从0置为1。
下面代码的a[i][j]可以看作访问矩阵

//-----------深搜------------
#include <bits/stdc++.h>
using namespace std;
const int maxn = 35;
int a[maxn][maxn],b[maxn][maxn];
int dx[5] = {0,-1,1,0,0};
int dy[5] = {0,0,0,-1,1};
int n,i,j;
void dfs(int p,int q){
    int i;
    if (p < 0 || p > n + 1 || q < 0 || q > n + 1 || a[p][q] != 0)
		return;
    a[p][q] = 1;
    for (i = 1;i <= 4;i++) 
		dfs(p + dx[i],q + dy[i]);
}
int main(){
// 	freopen("in.txt","r",stdin);	
    cin >> n;
    for (i = 1;i <= n;i++)
        for (j = 1;j <= n;j++){
            cin >> b[i][j];
            a[i][j]=b[i][j];
            // if (b[i][j] == 0) a[i][j] = 0;
            // else a[i][j] = 1;
        }
    dfs(0,0);
    for (i = 1;i <= n;i++){
        for (j = 1;j <= n;j++)
        if (a[i][j] == 0) cout << 2 << ' ';
        else cout << b[i][j] << ' ';
        cout << endl;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值