codeforces 208(div2) A+B+C+D

链接:http://codeforces.com/contest/358 

A:

题意:给n个数,按顺序的从第一个到最后,从当前点到下一个点,就在两点之间画一个弧,问按照顺序画的话,会不会出现有交叉的情况,有则输出yes否则no

思路:把每一个弧都存下来,判断当前的弧和之前所有的弧有没有交叉,O(n^2)的算法。

注意:弧存的时候注意数字大小,判断弧的时候分情况就行了。

#include<cstdio>
#include<algorithm>
#include<iostream>
#include<string>
#include<cstring>
#include<cmath>
#include<queue>
#include<vector>
using namespace std;
int n;
int a[1005];
struct node{
	int l,r;
}s[1005];
int ind = 0;
int main(){
	cin>>n;
	for (int i = 0; i < n; i++)
	{
		cin>>a[i];
	}
	if(n <= 2)puts("no");
	else{
		int flag = 0;
		int ff = 1;
		int l = a[0],r = a[1];
		if(l > r){ff = 2;}
		s[ind].l = min(l,r);s[ind++].r = max(l,r);
		for (int i = 2; i < n && flag == 0; i++)
		{			
			if(a[i] < r)ff = 2;
			else ff = 1;			
			l = r,r = a[i];
			for (int j = 0; j < ind; j++)
			{
				if(ff == 1){
					if(r > s[j].r && l < s[j].r && l > s[j].l)flag=1;
					else if(l < s[j].l&&r>s[j].l&&r<s[j].r)	flag = 1;
				}else{
					if(l > s[j].r && r < s[j].r && r > s[j].l)flag=1;
					else if(r < s[j].l&&l>s[j].l&&l<s[j].r)	flag = 1;
				}
				if(flag)break;
			}
			s[ind].l = min(l,r);s[ind++].r = max(l,r);
		}
		if(flag)puts("yes");
		else puts("no");
	}
	//system("pause");
	return 0;
}


B:

题意:主角要给女朋友发信息,但是要加密的。加密方案是在每个单词前都有‘<3’,最后一个单词之后还有一个'<3',他想要发的短信是加完'<3'之后的一个串。

现在再给你一个串,判断这个串里是不是完全包含上面那个加密后的串,如果包含yes否则no。

做法:构造好加密好的串,一位一位的比较就可以了。

#include<cstdio>
#include<algorithm>
#include<iostream>
#include<string>
#include<cstring>
#include<cmath>
#include<queue>
#include<vector>
using namespace std;
int n;
char a[1000006],b[1000006],s[100005];
int main(){
    int l = 0;
    cin>>n;
    a[l++] = '<';a[l++] = '3';
    for (int i = 0; i < n; i++)
    {
        scanf("%s",s);
        for (int j = 0; s[j] ; j++)
        {
            a[l++] = s[j];
        }
        a[l++] = '<';a[l++] = '3';
    }
    scanf("%s",b);
    int len = strlen(b);
    int k = 0;
    for (int i = 0; i < len; i++)
    {
        if(b[i] == a[k])k++;
    }
    puts(k == l?"yes":"no");
    return 0;
}


C:

题意:主角要听从女朋友的命令,女朋友有两种命令,一种是非0,一个是0.有三个container:queue,stack,deck,如果是非0的命令,就要求主角把这个数字加入一种容器里,如果是0的命令,就要求从容器中取出一个数,然后清空三个容器。要求从容器里取出的数的和是最大的(因为取出数的和是女朋友亲他的数目)。

做法:如果两个0命令之间的非0数字不大于3,就可以把三个容器一个一个的加进去,然后pop掉。

如果大于三,就要先找出最大的三个,分别加到三个容器的front,剩下的加到deck的back。找最大的三个,我是用优先队列找的。

#include<cstdio>
#include<algorithm>
#include<iostream>
#include<string>
#include<cstring>
#include<cmath>
#include<queue>
#include<vector>
#include<stack>
#include<functional>
using namespace std;
#define maxn 3005
int a[100005];
struct node{
	int l,n;	
}b[100005];
priority_queue<int> Q;
int main(){
	int n,ind;
	while(cin>>n){
		ind = 0;
		for (int i = 0; i < n; i++)cin>>a[i];
		int num = 0,l = 0;
		if(a[0] == 0)b[ind++].n = 0,l = 1;
		else num++;
		for (int i = 1; i < n; i++)
		{
			if(a[i] == 0)b[ind].l=l,b[ind++].n = num,num = 0,l = i+1;
			else num++;
		}
		int ff = 0;
		while(!Q.empty())Q.pop();
		int x,y,z;
		for (int i = 0; i < ind; i++)
		{
			if(b[i].n == 0){puts("0");continue;}
			else if(b[i].n == 1){
				puts("pushStack");
				printf("1 popStack\n");
			}else if(b[i].n == 2){
				puts("pushStack");puts("pushQueue");
				printf("2 popStack popQueue\n");
			}else{
				while(!Q.empty()){Q.pop();}
				for (int j = 0; j < b[i].n; j++)Q.push(a[b[i].l+j]);
				ff = 0;
				while(ff < 3){
					for (int j = 0; j < b[i].n; j++)
					{
						if(ff == 0){
							if(Q.top() == a[b[i].l + j]){
								Q.pop();x = j;
								ff++;
								continue;
							}
						}else if(ff == 1){
							if(Q.top() == a[b[i].l + j]){
								Q.pop();y = j;
								ff++;
								continue;
							}
						}else if(ff == 2){
							if(Q.top() == a[b[i].l + j]){
								Q.pop();z = j;
								ff++;
								break;
							}
						}
					}
				}
				for (int j = 0; j < b[i].n; j++)
				{
					if(j == x){
						puts("pushStack");
					}else if(j == y){
						puts("pushQueue");
					}else if(j == z){
						puts("pushFront");
					}else puts("pushBack");
				}
				printf("3 popStack popQueue popFront\n");
			}
		}
		if(num){
			for (int i = 0; i < num; i++)
			{
				puts("pushStack");
			}
		}
	}
	return 0;
}


D:

题意:主角女朋友要喂排成一列的兔子,兔子被喂到时有三种happy值,一种是它旁边的两个兔子都没被喂,一种是之前有一个被喂过,一种是左右两个之前都被喂到了。

思路:

/*
So when I am at a particular hare I should know if I have fed the previous hare and I have to make a decision for the current one that whether it should be fed now or after the next hare
So state would be like ( int position, bool previous )
if previous is true (previous hare is already fed) :

 1. I can feed the current hare now so result1= solve( position+1, 1)+ b[position]
 2. I will feed after the next one so  result2 =  solve( position+1, 0)+ c[position]
 

Else if previous is false (previous hare is not fed)

 1. I can feed the current hare now so result1= solve( position+1, 1)+ a[position]
 2. I will feed after the next one so  result2 =  solve( position+1, 0)+ b[position]

  return max(result1,result2)
*/
#include<cstdio>
#include<algorithm>
#include<iostream>
#include<string>
#include<cstring>
#include<cmath>
#include<queue>
#include<vector>
using namespace std;
#define maxn 3005
int n;
int a[maxn],b[maxn],c[maxn],dp[maxn][2];
int main(){
    while(cin>>n){
        for (int i = 0; i < n; i++)cin>>a[i];
        for (int i = 0; i < n; i++)cin>>b[i];
        for (int i = 0; i < n; i++)cin>>c[i];
        memset(dp,0,sizeof(dp));
        dp[n-1][0] = a[n-1];dp[n-1][1] = b[n-1];
        for (int i = n-2; i >= 0; i--)
        {
            dp[i][0] = max(a[i]+dp[i+1][1],b[i]+dp[i+1][0]);
            dp[i][1] = max(b[i]+dp[i+1][1],c[i]+dp[i+1][0]);
        }
        cout<<dp[0][0]<<endl;
    }
    return 0;
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
资源包主要包含以下内容: ASP项目源码:每个资源包中都包含完整的ASP项目源码,这些源码采用了经典的ASP技术开发,结构清晰、注释详细,帮助用户轻松理解整个项目的逻辑和实现方式。通过这些源码,用户可以学习到ASP的基本语法、服务器端脚本编写方法、数据库操作、用户权限管理等关键技术。 数据库设计文件:为了方便用户更好地理解系统的后台逻辑,每个项目中都附带了完整的数据库设计文件。这些文件通常包括数据库结构图、数据表设计文档,以及示例数据SQL脚本。用户可以通过这些文件快速搭建项目所需的数据库环境,并了解各个数据表之间的关系和作用。 详细的开发文档:每个资源包都附有详细的开发文档,文档内容包括项目背景介绍、功能模块说明、系统流程图、用户界面设计以及关键代码解析等。这些文档为用户提供了深入的学习材料,使得即便是从零开始的开发者也能逐步掌握项目开发的全过程。 项目演示与使用指南:为帮助用户更好地理解和使用这些ASP项目,每个资源包中都包含项目的演示文件和使用指南。演示文件通常以视频或图文形式展示项目的主要功能和操作流程,使用指南则详细说明了如何配置开发环境、部署项目以及常见问题的解决方法。 毕业设计参考:对于正在准备毕业设计的学生来说,这些资源包是绝佳的参考材料。每个项目不仅功能完善、结构清晰,还符合常见的毕业设计要求和标准。通过这些项目,学生可以学习到如何从零开始构建一个完整的Web系统,并积累丰富的项目经验。
资源包主要包含以下内容: ASP项目源码:每个资源包中都包含完整的ASP项目源码,这些源码采用了经典的ASP技术开发,结构清晰、注释详细,帮助用户轻松理解整个项目的逻辑和实现方式。通过这些源码,用户可以学习到ASP的基本语法、服务器端脚本编写方法、数据库操作、用户权限管理等关键技术。 数据库设计文件:为了方便用户更好地理解系统的后台逻辑,每个项目中都附带了完整的数据库设计文件。这些文件通常包括数据库结构图、数据表设计文档,以及示例数据SQL脚本。用户可以通过这些文件快速搭建项目所需的数据库环境,并了解各个数据表之间的关系和作用。 详细的开发文档:每个资源包都附有详细的开发文档,文档内容包括项目背景介绍、功能模块说明、系统流程图、用户界面设计以及关键代码解析等。这些文档为用户提供了深入的学习材料,使得即便是从零开始的开发者也能逐步掌握项目开发的全过程。 项目演示与使用指南:为帮助用户更好地理解和使用这些ASP项目,每个资源包中都包含项目的演示文件和使用指南。演示文件通常以视频或图文形式展示项目的主要功能和操作流程,使用指南则详细说明了如何配置开发环境、部署项目以及常见问题的解决方法。 毕业设计参考:对于正在准备毕业设计的学生来说,这些资源包是绝佳的参考材料。每个项目不仅功能完善、结构清晰,还符合常见的毕业设计要求和标准。通过这些项目,学生可以学习到如何从零开始构建一个完整的Web系统,并积累丰富的项目经验。
资源包主要包含以下内容: ASP项目源码:每个资源包中都包含完整的ASP项目源码,这些源码采用了经典的ASP技术开发,结构清晰、注释详细,帮助用户轻松理解整个项目的逻辑和实现方式。通过这些源码,用户可以学习到ASP的基本语法、服务器端脚本编写方法、数据库操作、用户权限管理等关键技术。 数据库设计文件:为了方便用户更好地理解系统的后台逻辑,每个项目中都附带了完整的数据库设计文件。这些文件通常包括数据库结构图、数据表设计文档,以及示例数据SQL脚本。用户可以通过这些文件快速搭建项目所需的数据库环境,并了解各个数据表之间的关系和作用。 详细的开发文档:每个资源包都附有详细的开发文档,文档内容包括项目背景介绍、功能模块说明、系统流程图、用户界面设计以及关键代码解析等。这些文档为用户提供了深入的学习材料,使得即便是从零开始的开发者也能逐步掌握项目开发的全过程。 项目演示与使用指南:为帮助用户更好地理解和使用这些ASP项目,每个资源包中都包含项目的演示文件和使用指南。演示文件通常以视频或图文形式展示项目的主要功能和操作流程,使用指南则详细说明了如何配置开发环境、部署项目以及常见问题的解决方法。 毕业设计参考:对于正在准备毕业设计的学生来说,这些资源包是绝佳的参考材料。每个项目不仅功能完善、结构清晰,还符合常见的毕业设计要求和标准。通过这些项目,学生可以学习到如何从零开始构建一个完整的Web系统,并积累丰富的项目经验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值