[CSP冲刺班]CSP-J2011模拟赛#2总结

[CSP冲刺班]CSP-J2011模拟赛#2总结

题目
T1 蜗牛老师的成绩统计
T2小蜗牛的逃离
T3蜗牛老师研究基因
T4蜗牛老师的代码
T5蜗牛老师的跳跃

T1 蜗牛老师的成绩统计

{
题目大意:给出每个人的时,分,秒,从小到大输出
思路:开结构体,参数为时,分,秒,自定义排序,sort()一下

在bool mycmp(made a,made b){
	return a.t<b.t||(a.t==b.t&&a.f<b.f)||(a.t==b.t&&a.f==b.f&&a.m<b.m);
}//t为小时,f为分钟,m为秒

最后得分:80pts
原因:数据最后改的,数组开小了,都怪没看钉钉
}

---------------------------------------我是分割线-----------------------------------------------

T2小蜗牛的逃离

{
题目大意:树上的小猴想在第n+1天搬家,于是他有n天准备能量,1.他可以在一天内树上采取m个能量,2.或今天不采摘能量将m加一(对不起,本人语文只考了95分,(满分120),表达能力极差,若看不懂请自行点开链接)

思路:本来我想的是动态规划,但是由于数据范围极大,导致二重循环也会超,所以只能放弃,开始考虑一重循环怎么搞,本蒟蒻便想到了贪心,可是怎么贪呢???所以我便考虑了如果m加上1能加多少能量,可以获得多少收益,是n-i,(当前天数为i),但是如果今天没有加m,反而是采摘的话可以加上m个能量,所以比较n-i和m就可以找到最优解了,想出来后,我就觉得我怎么能怎么聪明,太棒了!!!(疯狂自恋)
代码

//T2,这个代码真的有点帅!! 
#include<bits/stdc++.h>
using namespace std;
int y[110000];
int main()
{
	freopen("escape.in","r",stdin);
	freopen("escape.out","w",stdout);
	int t;
	cin>>t;
	for(int i=1;i<=t;i++){
		int n,x;
		bool f=0;
		cin>>n>>x;
		long long sum=0;
		memset(y,0,sizeof(y));
		for(int j=1;j<=n;j++)
			cin>>y[j];
		for(int j=1;j<=n;j++){
			if(sum+x-y[j]<0){//如果当天采后还不够吃,则-1 
				f=1;
				cout<<-1<<endl;
				break;
			}
			if(x<(n-j)&&sum-y[j]>=0)
			 x++;
			else sum+=x;//否则就加上当前采摘数量 
			sum-=y[j];//减去花费 
//			printf("j== %d,y[j]== %d,sum== %d,x== %d\n",j,y[j],sum,x);
		}
		if(f==0) cout<<sum<<endl;
	}
	return 0;
}

最后得分:100pts
}

T3 蜗牛老师研究基因

{
题目大意:我也不知道怎么形容这个题干,太长了,还很不好理解,自己点链接吧
思路:用一个类似桶的东西存储时候出现,最后在比较一下

//T3
#include<bits/stdc++.h>
using namespace std;
char a[100000];
char b[100000];
int p[100000];
char num[5]={'0','A','C','G','T'};
int f[100000][5];
int main()
{
	freopen("gene.in","r",stdin);
	freopen("gene.out","w",stdout);
	int n,m;
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){//第j列 
			cin>>a[j];
			for(int k=1;k<=4;k++){
				if(a[j]==num[k]){
					f[j][k]=1;
					break;
				}
			}
		}
	}
//	for(int i=1;i<=m;i++){
//		for(int j=1;j<=4;j++){
//			if(f[i][j])
//				cout<<j<<" "; 
//		}
//		cout<<endl;
//	}
	int nu=0;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			cin>>b[j];
			for(int k=1;k<=4;k++){
				if(b[j]==num[k]){
					if(f[j][k]==1){
						if(p[j]==0){
							nu++;
							p[j]=1;
//						cout<<1<<" ";	
						}
//						w=1;
						break;
					}
				}
			}
//			cout<<endl;
		}
	}
	cout<<m-nu;
	return 0;	
} 

最后得分:100pts
}

T4蜗牛老师的代码

{
思路:本人太菜了,老师讲过类似的一道题叫:肉夹馍,可是我还是不会,打了50暴力
正解:分治,找到规律后每次折半

#include<bits/stdc++.h>
using namespace std;
long long a[110];
int main()
{
	freopen("code.in","r",stdin);
	freopen("code.out","w",stdout);
	string s;
	int n;
	cin>>s>>n;
	long long maxx=s.size();
	for(int i=1;i<=n;i++){
		long long x;
		cin>>x;
		while(maxx<x){
			long long maxx2=maxx;
			while(x>2*maxx2) maxx2*=2;
			x-=(maxx2+1);
			if(x==0) x=maxx2;
		}
		printf("%c\n",s[x-1]); 
	}
	// AB BA    ABB AA ABB
	return 0;
}

最后得分 50pts
}

T5蜗牛老师的跳跃

{
本人很菜,打了一个广搜,果断爆0,klz大佬A掉了!!,%%%%%
其实这道题广搜和DP都可以但是我广搜订正时只拿了40pts,所以就把DP代码发一下

#include<bits/stdc++.h>
using namespace std;
struct made{
	int up;//上升时间 
	int dowm;//下降时间 
	int sum;//循环时间 
}a[10000];
bool f[1100][1100];
int main()
{
	freopen("jump.in","r",stdin);
	freopen("jump.out","w",stdout);
	int t;
	cin>>t;
	for(int i=1;i<=t;i++){
		int n;
		cin>>n;
		memset(a,0,sizeof(a));
		memset(f,0,sizeof(f));
		f[0][0]=1;
		for(int j=1;j<=n;j++){
			scanf("%d%d",&a[j].up,&a[j].dowm);
			a[j].sum=a[j].up+a[j].dowm;
		}
		bool bol=1;
		for(int tim=0;tim<=1100&&bol==1;tim++){
			for(int wei=0;wei<=n+1;wei++){
				if(wei==n+1){
					if(f[wei][tim]){
						cout<<tim<<endl;
						bol=0;
						break;
					}
				}
				if(f[wei][tim]){
					for(int mov=-5;mov<=5;mov++){
						int nex=wei+mov;
						if(nex>=0&&nex<=n+1){
							int nti=tim+1;
							if((nex==n+1)||(nex==0)||(nti%a[nex].sum>=1&&nti%a[nex].sum<=a[nex].up)){
								f[nex][nti]=1;
							}
						}
					}
				}
			}
		}
		if(bol)
			cout<<"No"<<endl;
	}
	return 0;
}

最后得分 0pts
没有加注解,但是各位大佬肯定能看懂
}

最后得分=80+100+100+50+0=310pts;

我太菜了[哭]。

%%KLZ,CZL,ZBT,MMZ,FXR,RXB大佬,太强了!!

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值