OJ P1809 wzy的跑步

 这题我没有采用什么复杂的算法,简单的分类讨论之后一次过~

首先分三种情况:(但是这三种情况并不是完全的真正独立)

一是第一点有水塘;

二是最后一个点有水塘;

三是首尾都没有水塘。

这里说明一下为什么我要单独讨论首尾,因为wzy必须从1出发,到n结束,也就是说即使位置1和位置n有水塘,wzy也必须要踩

整体思路如下:

如果位置1(第一个点)有水塘,找到第一个无水塘的地方right,如果位置n(最后一个点)有水塘,找到最后一个无水塘的地方left,令begin=right,end=left(可以画个图理解一下)。此时整条路被分成了三段,中间两个断点分别是right(begin)和left(end)

易得:从位置i1到i2(i1,i2干燥,之间全是水塘)需要踩水塘的次数为:

(i2-i1-1)/k

对于第一段道路,若已知第一点有水塘,则wzy先到第一个点,此时踩了一次水塘,然后将位置1作为出发点,假设位置1无水塘(因为已经记录过踩水塘次数+1),找到第一个实际干燥的地方right,所需要经历的踩水塘次数为count+=(right-1-1)/k+1,这里的第一个1则表示假设干燥的位置1,最后的+1则表示踩了第一个水塘。第三段尾部同理,count+=(n-left-1)/k+1

接下来是中间道路,赋予了新的begin和end(在上文),这两个点都是干燥的,因为begin和end的初始值分别为1和n,所以即使位置1和位置n也是干燥的,也能轻松合并情况。找到第一个干燥点后,下标赋值为left,往后遍历,找到第二个干燥点,下标赋值为right,利用公式,count+=(right-left-1)/k;然后将right赋值给left,再找left的下一个right,以此类推......

其实思路很简单,可能被我讲复杂了

完整AC代码如下:

#include<iostream>
using namespace std;

int flag[10005];            	//堆空间,默认初始化全是0,等价于 int flag[10005]={0}; 
								//flag值为0表示没水塘,为1表示有水塘
int main(){
	int n,m,k;               	//n,m,k分别代表路径的长度,积水的个数以及wzy一次最远可以跨多远
	int num; 
	cin>>n>>m>>k;
	for(int i=1;i<=m;i++){ 		//将有水塘的点赋值为1 
		cin>>num;
		flag[num]=1;            
	}
	int left=0,right=1,count=0; //count为需要踩水塘的次数 
	int begin=1,end=n;          //重新定义begin,end变量,方便分类讨论 
	
	//若第一点有水塘 
	if(flag[1]==1){
		for(int i=2;i<=n;i++){	//找到第二个是水塘的点 
			if(flag[i]==0){
				right=i;
				break;
			}
		} 
		count+=(right-1-1)/k+1;
		begin=right;
	}
	
	//如果最后一个点有水塘
	if(flag[n]==1){
		for(int i=n-1;i>=1;i--){//找到倒数第二个是水塘的点 
			if(flag[i]==0){
				left=i;
				break;
			}
		}
		count+=(n-left-1)/k+1;
		end=left;
	} 
	
	//此时起点和终点都没有水塘 
	if(begin!=end){
		for(int i=begin;i<=end;i++){
			if(flag[i]==0){  
				left=i;
				int j;
				for(j=i+1;j<=end;j++){
					if(flag[j]==0){
						right=j;
						break;
					}
				}
				if(j>end) break;   //不写这句会陷入死循环! 
				count+=(right-left-1)/k;
			}
			i=right-1;
		}
	}
	
	//输出结果 
	cout<<count<<endl;
	
	return 0;
}

算法时间复杂度为O(n)

  • 3
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
package com.example.myapplication; import android.app.Activity; import android.os.Bundle; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.ImageView; import android.widget.ListView; import android.widget.TextView; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; public class MainActivity extends Activity { private int[] imgIds; private String[] titles; private String[] authors; private ArrayList<News> news; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); titles = new String[]{ "��ǰ��-���ܶ���24�������11�� ����ʤ�ϵ���", "�Ϻ����ѵ�������������Բ�����ά�з� ��Ե��ǿ", "��Σ�NBA����������Ǹ��", "����ѧϰ���,���Dz�֪������ô��ʼ", "�Ĺ���-ͯ�����粨�±�������� ����2-0ӡ��U22", "����������Ϊ���Ǻ���ƴ�� ����ȴ�ڼ�̤��������" }; authors = new String[]{ "������", "���ܶ���", "�ѵ���", "��˹��", "����", "����" }; imgIds = new int[]{ R.drawable.a1, R.drawable.a2, R.drawable.a3, R.drawable.a4, R.drawable.a5, R.drawable.a6, }; news = new ArrayList<News>(); News ns; for (int j=0;j<20;j++) { for (int i=0;i<titles.length;i++) { ns = new News(); ns.title = titles[i]; ns.author = authors[i]; SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); ns.time = sdf.format(new Date()); news.add(ns); } } ListView lv = (ListView) findViewById(R.id.lv); lv.setAdapter(new ListViewAdapter()); } class ListViewAdapter extends BaseAdapter { @Override public int getCount() { return news.size(); } @Override public News getItem(int position) { return news.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { View view ; ViewHolder viewHolder ; if (convertView == null) { view = View.inflate(MainActivity.this, R.layout.listview_item, null); viewHolder = new ViewHolder(); view.setTag(viewHolder); } else { view = convertView; viewHolder = (ViewHolder) view.getTag(); } viewHolder.title = (TextView) view.findViewById(R.id.tv_title); viewHolder.time = (TextView) view.findViewById(R.id.tv_time); viewHolder.author = (TextView) view.findViewById(R.id.tv_author); viewHolder.img = (ImageView) view.findViewById(R.id.img); News ns = news.get(position); viewHolder.title.setText(ns.title); viewHolder.time.setText(ns.time); viewHolder.author.setText(ns.author); viewHolder.img.setImageResource(imgIds[position % imgIds.length]); return view; } } class ViewHolder { TextView title ; TextView time; TextView author; ImageView img; } }
SJTU OJ是上海交通大学在线评测系统的简称。它是一个提供给学生练习编程和解决问题的平台。 首先,学生需要注册并登录SJTO OJ系统。系统会为每个注册用户分配一个唯一的用户ID和密码,以保证账户安全。 上机编程练习是SJTO OJ的主要功能之一。学生可以在系统中选择不同的编程题目,例如算法题、数据结构题、数学题等等。每道题目都附带了详细的题目描述和输入输出样例。学生需要根据题目要求,编写相应的程序,并在系统中提交代码。系统会自动编译和运行学生提交的代码,并对其进行评测。评测结果包括通过样例的数量、程序运行时间、内存占用等信息。 除了上机编程练习,SJTO OJ还提供了一些其他功能。例如,学生可以查看自己的解题记录和成绩,统计自己的编程能力和进步情况。他们可以参加在线比赛,与其他学生一同竞争,提高自己的编程水平。 作为一名学生,使用SJTO OJ可以有效地提升自己的编程技能和解决问题的能力。通过参与编程练习和比赛,学生可以不断学习新知识,发现并改进自己的不足之处。此外,SJTO OJ还为学生提供了一个交流的平台,他们可以与其他学生分享自己的解题思路和经验。 总之,SJTO OJ是一个非常有用的在线评测系统,通过使用它,学生可以提高自己的编程能力,并享受与其他同学交流和竞争的乐趣。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Haoyu Xiao

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值