1521 一维战舰

1521 一维战舰

对于n个格子,可放置战舰个数为(n+1)/(a+1),当我们指定一个点时,则减少(right-left)/(a+1)-(x-left)/(a+1)-(right-x)/(a+1)。

每做一次指定点,就做一次减法运算,直至总个数<k或指定m次完毕。

AC代码:

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3
 4 const int MAX=2e5+10;
 5 int vis[MAX];
 6
 7 int main(){
 8     int n,k,a,m,x;
 9     cin>>n>>k>>a>>m;
10     int flag=-1;
11     int left,right;
12     memset(vis,0,sizeof(vis));
13     int num=(n+1)/(a+1);
14     for(int i=0;i<m;i++){
15         cin>>x;
16         vis[x]=1;
17         for(left=x-1;left>0&&vis[left]==0;left--);
18         for(right=x+1;right<=n&&vis[right]==0;right++);
19         num-=(right-left)/(a+1)-(x-left)/(a+1)-(right-x)/(a+1);
20         if(num<k&&flag==-1){
21             flag=i+1;
22             break;
23         }
24     }
25     cout<<flag<<endl;
26     return 0;
27 }
时间: 2024-11-18 06:27:30

1521 一维战舰的相关文章

51Nod - 1521 一维战舰

51Nod - 1521 一维战舰 爱丽丝和鲍博喜欢玩一维战舰的游戏.他们在一行有n个方格的纸上玩这个游戏(也就是1×n的表格). 在游戏开始的时候,爱丽丝放k个战舰在这个表格中,并不把具体位置告诉鲍博.每一只战舰的形状是 1×a 的长方形(也就是说,战舰会占据a个连续的方格).这些战舰不能相互重叠,也不能相接触. 然后鲍博会做一系列的点名.当他点到某个格子的时候,爱丽丝会告诉他那个格子是否被某只战舰占据.如果是,就说hit,否则就说miss. 但是这儿有一个问题!爱丽丝喜欢撒谎.他每次都会告诉

51 nod 1521 一维战舰 时间复杂度O(n),同 Codeforces 567D. One-Dimensional Battle Ships 有详细注释

题目:51nod: 题目Codeforces: 题目注意到两个战舰不能挨在一起就可以了. // 每一段 struct node{ int left; // 段的左端点 int right; // 段的右端点 int length; // 段长度 int ship; // 段最大容纳战舰数 }arr[200005]; 每一段可容纳战舰数: ship*a + (ship - 1) <= length;   -->   ship = (length+1) / (a+1);(舍去小数部分) 构造出这么

【51nod-1521】一维战舰

爱丽丝和鲍博喜欢玩一维战舰的游戏.他们在一行有n个方格的纸上玩这个游戏(也就是1×n的表格). 在游戏开始的时候,爱丽丝放k个战舰在这个表格中,并不把具体位置告诉鲍博.每一只战舰的形状是 1×a 的长方形(也就是说,战舰会占据a个连续的方格).这些战舰不能相互重叠,也不能相接触. 然后鲍博会做一系列的点名.当他点到某个格子的时候,爱丽丝会告诉他那个格子是否被某只战舰占据.如果是,就说hit,否则就说miss. 但是这儿有一个问题!爱丽丝喜欢撒谎.他每次都会告诉鲍博miss. 请你帮助鲍博证明爱丽

JAVA一维数组

import java.applet.Applet; import java.awt.*; //用*表示包含awt这个源包下的所有方法成员,awt为图形界面设计包 public class Applet_Example extends Applet{ int a[]; //定义一个一维数组 public void init(){ a=new int[5]; //定义一个一维数组,该数组包含5个元素 a[0]=100; //分别对数组元素赋值 a[1]=101; a[2]=102; a[3]=10

一维数组的三种写法

/** *一维 数组的几种写法 * 记住:①数组的左边不能有数字 *   ②数组的右边既然初始化了数组,那么就要赋值 */ //一维数组的标准格式 String[] arr1 = new String[]{"bo","li","jian"}; //上面的简写格式 String[] arr2 = {"bo","li","jian"}; //初始化容量 String[] arr3 = new

输出 一维数组中最大的数+数组遍历

1 //将数组中最大的数输出 2 //数组遍历 3 int[] arr = new int[]{2,4,1,6,10,11}; 4 System.out.println("输出一维数组 :"); 5 for(int i=0; i<arr.length;i++) 6 { 7 System.out.print(arr[i]+" "); 8 } 9 10 System.out.println(); 11 12 int max = arr[0]; 13 for(int

算法练习:一维数组旋转

题目描述:求一个一维数组向右旋转K个位置后的结果.比如,一维数组{1, 2, 3, 4, 5},当k = 2时,求得的结果为{4, 5, 1, 2, 3}.要求常数级空间复杂度,允许修改原有数组. 一.使用额外的空间(在不要求常数级空间复杂度的情况下) 这样很简单,使用一个额外的空间,保存原有数组的元素,然后可以错位复制原有数组 元素,即可达到题目的要求.比如数组{1, 2, 3, 4, 5},当k = 2时,先将4,5复制到结果数组,然后将1,2,3复制到结果数组的后面部分. //使用额外空间

随机化一维数组

一 问题:假设有一个一维整型数组,随机化这个数组,即使得每个元素在数组中随机出现,且概率一样. 二 解题思路: 1. 构造两个数组,一个辅助数组,用于哈希,另一个用于保留优先级.例如,输入一组数据2,1,0 那么,辅助数组为0,1,2,即首先随机生成一个3之内的整数,比如2,如果在2的位置没有元素,则放入,否则再次随机生成元素,直到辅助数组中所有元素都不相同,将这些都不相同的元素放入优先级数组. 2. 按照优先级,对原数组进行插入排序. 三 代码 /***********************

动态一维、二维输入数组变量

动态输入一维变量: #include <iostream>using namespace std;int main(){int n; cin>>n; int *p=new int[n]; for(int i=0;i<n;i++) { cin>>p[i]; }for(int i=0;i<n;i++) { cout<<p[i]<<t" "; } return 0;} 动态输入二维变量: #include <ios