模拟测试(vj)

做这份模拟测试,已经崩溃了,英文看不懂,题意理解错。到结束了只a了第一题,人生陷入了低谷,于是花了一天的时间终于把不会的弄明白了,在这里写一份总结~

T1,简单的模拟,如果打枪打中一支鸟,将这个位置设为0,并向两边扩散,注意这个位置一定要有鸟。

代码~

#include<bits/stdc++.h>
using namespace std;
int a[30000];
int n,m;

int main()
{
	cin>>n;
	for(int i=1;i<=n;i++)
		cin>>a[i];
	cin>>m;
	for(int i=1;i<=m;i++)
	{
		int t1,t2;
		cin>>t1>>t2;
		if(a[t1]>=t2)
		{
			int l=t2-1,r=a[t1]-t2;
			a[t1-1]+=l,a[t1+1]+=r;
			a[t1]=0;
		}
	}
	for(int i=1;i<=n;i++)
		cout<<a[i]<<"\n";
    return 0;
}

 T2.dp的思想,我们设dp[i][t][w]表示在i个取完之后总厚度为t,上面的宽度为w,于是记忆化搜索就很好写出来啦(初始化dp为-1,为没有走过)

#include<bits/stdc++.h>
#define inf 120390420
using namespace std;
int w[300],t[300];
int n;
int f[300][300][300];
int dp(int i,int tt,int ww)
{
	if(tt>200||ww>200) return inf;
	if(i==n+1) return ww<=tt?tt:inf;
	int &ans=f[i][tt][ww];
	if(ans>=0) return ans;
	return ans=min(dp(i+1,tt+t[i],ww),dp(i+1,tt,ww+w[i]));
}

int main()
{
	cin>>n;
	memset(f,-1,sizeof(f));
	for(int i=1;i<=n;i++)
		cin>>t[i]>>w[i];
	cout<<dp(1,0,0)<<endl;
	return 0;

}

附带同学的代码,背包的思想:将t看成费用,而w为价值,于是二分+背包就可以出来了,不过他好像没有用二分

#include<bits/stdc++.h>
using namespace std;
int n;
int t[200],w[200];
int f[200];
int sum=0,s=0;

int solve(int x)
{
	f[0]=0;
	for(int i=1;i<=x;i++) f[i]=-12214019;
	for(int i=1;i<=n;i++)
		for(int j=x;j>=t[i];j--)
			f[j]=max(f[j],f[j-t[i]]+w[i]);
	return x>=(s-f[x]);
}
int main()
{
	cin>>n;
	for(int i=1;i<=n;i++)
	{	cin>>t[i]>>w[i];sum+=t[i];s+=w[i];}
	for(int i=1;i<=sum;i++)
		if(solve(i)) {
			cout<<i<<endl;break;
		}

    return 0;
}

T3.就是运用数学的知识,首先我们可以推出夹在两个1-1之间的0的个数是2^(n-1),而可重集合的全排列是等于C(num,a),C(num-a,b)以此类推,于是我们利用乘法原理就可以做出来了。组合数的话用杨辉三角,起点从0开始,这也算小技巧吧,get+,由于数据比较小,不用高精度快速幂,也感觉不错~

#include<bits/stdc++.h>
#define LL long long
#define mod 1000000007
using namespace std;
LL n,m;
LL b[2000000];
LL c[2000][2000];
vector<LL> q;
vector<LL> v;
int Pow(int a,int b)
{
	int ans=1;
	for(int i=1;i<=b;i++)
		ans=(ans*a)%mod;
	return ans%mod;
}

int main()
{
	cin>>n>>m;
	for(int i=0;i<=1000;i++) c[i][0]=1;
	for(int i=1;i<=1000;i++)
		for(int j=1;j<=1000;j++)
			c[i][j]=(c[i-1][j]+c[i-1][j-1])%mod;
	if(m==0) {cout<<"0\n";return 0;}
	for(LL i=1;i<=m;i++)
		cin>>b[i];
	b[0]=0;
	b[m+1]=n+1;
	sort(b,b+m+2);
	for(LL i=1;i<=m+1;i++)
		if(b[i]-b[i-1]>1){
			q.push_back(b[i]-b[i-1]-1);
			if(i!=1&&i!=m+1)
				v.push_back(b[i]-b[i-1]-1);
		}
	LL tot=n-m, ans=1;
	for(LL i=0;i<q.size();i++)
	{
		ans*=c[tot][q[i]],ans%=mod;
		tot-=q[i];
	}
	for(LL i=0;i<v.size();i++)
		ans*=Pow(2,v[i]-1),ans%=mod;
	cout<<ans<<endl;
	return 0;
}

T4.就是模拟,我们可以运用巧妙地办法,只计算在1,n或1,m中的次数,根据奇偶性,其中的碰撞次数应该为m+n-2,于是我们每一次计算的时候判断边界条件就可以了~

#include<bits/stdc++.h>
#define inf 12831240
#define LL long long
using namespace std;
LL n,m;

map<LL,LL> book[300000];
LL ans=1;
LL sx,sy;
LL x,y;
int main()
{
	cin>>n>>m;cin>>x>>y;
	char s[2];cin>>s;
	if(s[0]==‘D‘) sx=1;else sx=-1;
	if(s[1]==‘R‘) sy=1;else sy=-1;
	LL res=n+m-2;
	if(x==1||y==1||x==n||y==m) book[x][y]=1,res--;
	LL num=0;
	while(1)
	{
		LL dis=inf;
		num++;
		if(num>=1293821){ cout<<"-1";return 0;}
		if(sx==1) dis=min(dis,n-x);else dis=min(dis,x-1);
		if(sy==1) dis=min(dis,m-y);else dis=min(dis,y-1);
		x+=sx*dis,y+=dis*sy,ans+=dis;
		if(x==1) sx=1;else if(x==n) sx=-1;
		if(y==1) sy=1;else if(y==m) sy=-1;
		if(book[x][y]==0) book[x][y]=1,res--;
		if(res==0) {cout<<ans<<endl;return 0;}
	}

    return 0;
}

T5.是一道树形dp,我们枚举所有的边,然后断掉这条边之后,在剩下的两个联通块中分别找出到各个节点距离之和最小的节点,然后和ans进行比较,比较的时候注意,很多小细节要加以深思,比如说/2,*的部分。我们可以设size[x]表示以x为根节点的子树的大小,f[x]表示x到各个位置的距离,然后根据关系就可以求解了,具体看代码的dfs和find部分~

#include<bits/stdc++.h>
#define maxn 124890
#define LL long long
using namespace std;
struct Edge{LL w,to,next;}e[maxn];
LL cnt=1,n;
LL ans=1e18;
LL head[maxn],f[maxn],sz[maxn];
void add(LL u,LL v,LL w)
{
	e[++cnt].to=v;
	e[cnt].w=w;
	e[cnt].next=head[u];
	head[u]=cnt;
}

void dfs(LL x,LL fa)
{
	f[x]=0,sz[x]=1;
	for(LL i=head[x];i;i=e[i].next)
	{
		LL j=e[i].to;
		if(j!=fa)
		{
			dfs(j,x);
			sz[x]+=sz[j],f[x]+=sz[j]*e[i].w+f[j];
		}
	}
}

LL find(LL x,LL fa,LL &p,LL num)
{
	p=min(p,f[x]);
//	cout<<x<<" "<<f[x]<<"\n";
	for(LL i=head[x];i;i=e[i].next)if(e[i].to!=fa)
	{
		f[e[i].to]=f[x]+(num-2*sz[e[i].to])*e[i].w;
		find(e[i].to,x,p,num);
	}
}

int main()
{
	cin>>n;
	for(LL i=1;i<=n-1;i++)
	{
		LL t1,t2,t3;
		cin>>t1>>t2>>t3;
		add(t1,t2,t3);
		add(t2,t1,t3);
	}
	LL i=2;
	while(i<=cnt)
	{
		dfs(e[i].to,e[i^1].to);
		dfs(e[i^1].to,e[i].to);
		LL p1=1e18,p2=1e18;
		find(e[i].to,e[i^1].to,p1,sz[e[i].to]);
		find(e[i^1].to,e[i].to,p2,sz[e[i^1].to]);
		LL sum=0;
		for(LL ii=1;ii<=n;ii++)
			sum+=f[ii];//表示该节点到其他节点的距离,算2倍
		ans=min(ans,sum/2+sz[e[i].to]*sz[e[i^1].to]*e[i].w+p1*sz[e[i^1].to]+p2*sz[e[i].to]);
		i+=2;
	}
	cout<<ans<<endl;
	return 0;
}
时间: 2024-12-22 00:23:30

模拟测试(vj)的相关文章

Android单元测试与模拟测试详解

测试与基本规范 为什么需要测试? 为了稳定性,能够明确的了解是否正确的完成开发. 更加易于维护,能够在修改代码后保证功能不被破坏. 集成一些工具,规范开发规范,使得代码更加稳定( 如通过 phabricator differential 发diff时提交需要执行的单元测试,在开发流程上就可以保证远端代码的稳定性). 2. 测什么? 一般单元测试: 列出想要测试覆盖的异常情况,进行验证. 性能测试. 模拟测试: 根据需求,测试用户真正在使用过程中,界面的反馈与显示以及一些依赖系统架构的组件的应用测

微信在线信息模拟测试工具(基于Senparc.Weixin.MP)

目前为止似乎还没有看到过Web版的普通消息测试工具(除了官方针对高级接口的),现有的一些桌面版的几个测试工具也都是使用XML直接请求,非常不友好,我们来尝试做一个“面向对象”操作的测试工具. 测试工具在线DEMO:http://weixin.senparc.com/SimulateTool Senparc.Weixin.MP是一个开源的微信SDK项目,地址:https://github.com/JeffreySu/WeiXinMPSDK (其中https://github.com/Jeffrey

css Hack,用IE11模拟测试的,条件注释要找真IE去测,模拟的无效

<!DOCTYPE html> <!--[if lt IE 7 ]> <html class="ie6 ie"> <![endif]--> <!--[if IE 7 ]> <html class="ie7 ie"> <![endif]--> <!--[if IE 8 ]> <html class="ie8 ie"> <![endif]

2016年上半年软考真题在线模拟测试,提前知晓你的成绩

2016年上半年软考于5月21日结束了,考试完想知道结果的急切心理,几乎每个经历过上学时代的人都能深刻体验到.如果你想知道你考的怎么样,如果你想要提前知道你的成绩,如果你想知道你哪个地方出错了,如果你想知道你哪个地方知识掌握的不够想要更深入的去理解,那就来希赛软考学院吧!希赛软考学院提供2016年上半年软考真题在线模拟测试,有标准的参考答案,有专业老师的解析视频,让你提前知晓你的成绩,让你再次巩固学习. 希赛授课专家介绍 张友生,计算机应用技术博士,软考培训教程系列丛书主编,考试指定教材<系统分

Mock 模拟测试简介及 Mockito 使用入门

Mock 是什么 mock 测试就是在测试过程中,对于某些不容易构造或者不容易获取的对象,用一个虚拟的对象来创建以便测试的测试方法.这个虚拟的对象就是mock对象.mock对象就是真实对象在调试期间的代替品. 简单的看一张图 我们在测试类 A 时,类 A 需要调用类 B 和类 C,而类 B 和类 C 又需要调用其他类如 D.E.F 等,假如类 D.E.F 构造很耗时又或者调用很耗时的话是非常不便于测试的(比如是 DAO 类,每次访问数据库都很耗时).所以我们引入 Mock 对象. 如上图,我们将

asp.net中模拟测试smtp发邮件

最近在编程人生里要测试一个会员邮件的功能,就写了下面的代码. 在asp.net 中,有时要测试发信SMTP,但如果在单元测试中,如果没方便好用的 smtp怎么办,其实还是有办法模拟的,下面讲解下: 在web.config 中设置 <system.net>   <mailSettings>      <smtp deliveryMethod="SpecifiedPickupDirectory">          <specifiedPickup

2018冬令营模拟测试赛(三)

2018冬令营模拟测试赛(三) [Problem A]摧毁图状树 试题描述 输入 见"试题描述" 输出 见"试题描述" 输入示例 见"试题描述" 输出示例 见"试题描述" 数据规模及约定 见"试题描述" 题解 这题没想到贪心 QwQ,那就没戏了-- 贪心就是每次选择一个最深的且没有被覆盖的点向上覆盖 \(k\) 层,因为这个"最深的没有被覆盖的点"不可能再有其它点引出的链覆盖它了,而它又

2018冬令营模拟测试赛(五)

2018冬令营模拟测试赛(五) [Problem A][UOJ#154]列队 试题描述 picks 博士通过实验成功地得到了排列 \(A\),并根据这个回到了正确的过去.他在金星凌日之前顺利地与丘比签订了契约,成为了一名马猴烧酒. picks 博士可以使用魔法召唤很多很多的猴子与他一起战斗,但是当猴子的数目 \(n\) 太大的时候,训练猴子就变成了一个繁重的任务. 历经千辛万苦,猴子们终于学会了按照顺序排成一排.为了进一步训练,picks 博士打算设定一系列的指令,每一条指令 \(i\) 的效果

2018冬令营模拟测试赛(十七)

2018冬令营模拟测试赛(十七) [Problem A]Tree 试题描述 输入 见"试题描述" 输出 见"试题描述" 输入示例 见"试题描述" 输出示例 见"试题描述" 数据规模及约定 见"试题描述" 题解 这个数据范围肯定是树上背包了. 令 \(f(i, j, k)\) 表示子树 \(i\) 中选择了 \(j\) 个节点,路径与根的连接情况为 \(k\),具体地: \(k = 0\) 时,路径的两个端点