CF1256(div3 java题解)
A:
题意:给定A个N元,B个一元,问是否可以凑成S元。
思路:A*i+j=S 即 A*I<=S<=A*I+B 即min(S/N,A)+B>=S;
/* @author nimphy @create 2019-11-05-10:34 about:CF1256A */ import java.util.*; public class CF1256 { public static void main(String[] args) { Scanner In = new Scanner(System.in); int Q, A, B, N, S; Q = In.nextInt(); while (Q-- > 0) { A = In.nextInt(); B = In.nextInt(); N = In.nextInt(); S = In.nextInt(); int I = Math.min(S / N, A) * N; //System.out.println(I); if (I + B >= S) System.out.println("YES"); else System.out.println("NO"); } } }
B:
题意:给定一个排列,现在让你做一套操作,使得字典序最小。
思路:贪心,先尽量把1提到前面,然后是2....,如果满足{位置交换没用过,而且比左边的小就换}
/* @author nimphy @create 2019-11-05-11:34 about:CF1256B */ import java.util.*; public class CF1256 { static int[] a = new int[1010]; static boolean[] vis = new boolean[1010]; public static void main(String[] args) { Scanner In = new Scanner(System.in); int Q, N; Q = In.nextInt(); while (Q-- > 0) { N = In.nextInt(); for (int i = 1; i <= N; i++) { a[i] = In.nextInt(); vis[i] = false; } for (int i = 1; i <= N; i++) { int pos=0; for (int j = 1; j <= N; j++) { if (a[j] == i) { pos = j; break; } } while (pos > i && !vis[pos]&&a[pos]<a[pos-1]) { int t = a[pos]; a[pos] = a[pos - 1]; a[pos - 1] = t; vis[pos] = true; pos--; } } for (int i = 1; i <= N; i++) { System.out.print(a[i]+" "); } System.out.println(); } } }
C:
思路:贪心+情况可能多-----忽略。
------------------------------白嫖了输入优化--------------------------------------
D:
题意: 给定N,K和一个01串,你可以交换相邻的字符,但是次数不超过K次,求最后的最小字典序串。
思路:结论是,把前面的0移动到越前面,字典序最小。 那么我们从前往后扫‘0’,如果前面有x个‘1’,那么它可以和前面第min(x,K)个位置交换。
/* @author nimphy @create 2019-11-05-11:34 about:CF1256C */ import java.io.*; import java.util.*; public class CF1256 { private static boolean doLocalTest = System.getSecurityManager() == null; private Scanner sc = new Scanner(System.in); private PrintWriter out = new PrintWriter(new BufferedOutputStream(System.out)); public static void main(String[] args) { long executionTime = 0; if (doLocalTest) { executionTime = System.currentTimeMillis(); try { System.setIn((new FileInputStream("in"))); // System.setOut(new PrintStream(new File("out"))); } catch (FileNotFoundException e) { doLocalTest = false; } } CF1256 cf1256 = new CF1256(); cf1256.solve(); if (doLocalTest) { cf1256.out.println("======== [ End of Output] ========"); cf1256.out.println("> Time Spent: " + (System.currentTimeMillis() - executionTime) + " ms"); } cf1256.out.flush(); } static char[] a; static char[] ans = new char[10010]; void solve() { int T, N; long K; T = sc.nextInt(); while (T-- > 0) { N = sc.nextInt(); K = sc.nextLong(); a = sc.next().toCharArray(); // System.out.println(Arrays.toString(a)); int pre = 0; for (int i = 0; i < N && K > 0; i++) { if (a[i] == '1') { pre++; continue; } if (pre == 0) continue; int t = pre; if (K < t) t = (int) K; a[i - t] = '0'; a[i] = '1'; K -= t; } for (int i = 0; i < N; i++) out.print(a[i]); out.println(); } } } class Scanner { private BufferedReader bufferedReader; private StringTokenizer stringTokenizer; Scanner(InputStream in) { bufferedReader = new BufferedReader(new InputStreamReader(in)); stringTokenizer = new StringTokenizer(""); } String nextLine() { try { return bufferedReader.readLine(); } catch (IOException e) { throw new IOError(e); } } boolean hasNext() { while (!stringTokenizer.hasMoreTokens()) { String s = nextLine(); if (s == null) { return false; } stringTokenizer = new StringTokenizer(s); } return true; } String next() { hasNext(); return stringTokenizer.nextToken(); } int nextInt() { return Integer.parseInt(next()); } long nextLong() { return Long.parseLong(next()); } }
E:
题意:给的大小为N的集合,然后分组,每组元素个数不小于3个,代价是每组的最大值减最小值之和,求分组是的代价最小。
分组越多越好,那么可以假设最多6个一组。 懒得写了,毕竟要输出具体分组。(还不会java的结构体排序)
F:
题意:给定两个字符数组A[] , B[],长度相同。 现在你可以选择可以长度len,然后进行任意轮操作,每轮操作是反转一段A和一段B,其长度都是len,问最后是否可以相同。
思路:发现len选2最优,因为你无论len选多大,都可以由len=2转移过来,达到同样的效果; 那么现在len=2了,又发现,如果某一组有相同的字符,那么另外一组可以任意排列,所以YES; 而如果A和B都是各异的字符,那么如果逆序对的奇偶性相同,则YES。
/* @author nimphy @create 2019-11-05-11:34 about:CF1256F */ import java.io.*; import java.util.*; public class Main { private static boolean doLocalTest = System.getSecurityManager() == null; private Scanner sc = new Scanner(System.in); private PrintWriter out = new PrintWriter(new BufferedOutputStream(System.out)); public static void main(String[] args) { long executionTime = 0; if (doLocalTest) { executionTime = System.currentTimeMillis(); try { System.setIn((new FileInputStream("in"))); // System.setOut(new PrintStream(new File("out"))); } catch (FileNotFoundException e) { doLocalTest = false; } } Main fcy = new Main(); fcy.solve(); if (doLocalTest) { fcy.out.println("======== [ End of Output] ========"); fcy.out.println("> Time Spent: " + (System.currentTimeMillis() - executionTime) + " ms"); } fcy.out.flush(); } String a,b; int[] num1=new int[26]; int[] num2=new int[26]; void solve() { int T, N; long K; T = sc.nextInt(); while (T-- > 0) { N = sc.nextInt(); a=sc.next(); b=sc.next(); for(int i=0;i<26;i++) num1[i]=num2[i]=0; for(int i=0;i<N;i++) { num1[a.charAt(i)-'a']++; num2[b.charAt(i)-'a']++; } boolean Flag=true; for(int i=0;i<26;i++) if(num1[i]!=num2[i]) Flag=false; if(!Flag) { out.println("NO"); continue; } for(int i=0;i<26;i++) if(num1[i]>1||num2[i]>1) Flag=false; if(!Flag) { out.println("YES"); continue; } long inv1=0,inv2=0; for(int i=0;i<26;i++) num1[i]=num2[i]=0; for(int i=0;i<N;i++){ for(int j=a.charAt(i)-'a'+1;j<26;j++) inv1+=num1[j]; for(int j=b.charAt(i)-'a'+1;j<26;j++) inv2+=num2[j]; num1[a.charAt(i)-'a']++; num2[b.charAt(i)-'a']++; } if(Math.abs(inv1-inv2)%2==0) out.println("YES"); else out.println("NO"); } } } class Scanner { private BufferedReader bufferedReader; private StringTokenizer stringTokenizer; Scanner(InputStream in) { bufferedReader = new BufferedReader(new InputStreamReader(in)); stringTokenizer = new StringTokenizer(""); } String nextLine() { try { return bufferedReader.readLine(); } catch (IOException e) { throw new IOError(e); } } boolean hasNext() { while (!stringTokenizer.hasMoreTokens()) { String s = nextLine(); if (s == null) { return false; } stringTokenizer = new StringTokenizer(s); } return true; } String next() { hasNext(); return stringTokenizer.nextToken(); } int nextInt() { return Integer.parseInt(next()); } long nextLong() { return Long.parseLong(next()); } }
CF1256(div3 java题解)的更多相关文章
- 【剑指offer】(第 2 版)Java 题解
[剑指offer](第 2 版)Java 题解 第一章 面试的流程 略... 第二章 面试需要的基础知识 面试题 1. 赋值运算符函数 面试题 2. 实现 Singleton 模式 Solution ...
- 试题 历届试题 核桃的数量 java题解
资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 小张是软件项目经理,他带领3个开发组.工期紧,今天都在加班呢.为鼓舞士气,小张打算给每个组发一袋核桃(据传言能补脑).他的要求是: ...
- TopCoder SRMS 1 字符串处理问题 Java题解
Problem Statement Let's say you have a binary string such as the following: 011100011 One way to e ...
- LeetCode108_Convert SortedArray to BinarySearchTree(将有序数组转成二叉排序树) Java题解
题目: Given an array where elements are sorted in ascending order, convert it to a height balanced BST ...
- 7.15实习培训日志 java题解
周末总结 本周主要学习了markdown,git,docker等工具的使用.在本周的学习中,初步了解了markdown,git,docker的使用.本周的静态博客部署中,对于怎么显示一个博客内容,有两 ...
- LeetCode234_PalindromeLinkedList (推断是否为回文链表) Java题解
题目: Given a singly linked list, determine if it is a palindrome. Follow up: Could you do it in O(n) ...
- L1-027 出租 (20 分) java题解
下面是新浪微博上曾经很火的一张图: 一时间网上一片求救声,急问这个怎么破.其实这段代码很简单,index数组就是arr数组的下标,index[0]=2 对应 arr[2]=1,index[1]=0 对 ...
- L1-023 输出GPLT (20 分) java题解 GPLT天梯赛防坑技巧
上题目先 给定一个长度不超过10000的.仅由英文字母构成的字符串.请将字符重新调整顺序,按GPLTGPLT....这样的顺序输出,并忽略其它字符.当然,四种字符(不区分大小写)的个数不一定是一样多的 ...
- 试题 历届试题 翻硬币 java题解
问题描述 小明正在玩一个"翻硬币"的游戏. 桌上放着排成一排的若干硬币.我们用 * 表示正面,用 o 表示反面(是小写字母,不是零). 比如,可能情形是:**oo***oooo 如 ...
随机推荐
- 【Spring JDBC】spring jdbc 介绍(一)
Spring JDBC模块是Spring框架的基础模块之一.在Spring JDBC模块中,所有的类可以被分到四个单独的包: core 核心包:它包含了JDBC的核心功能.此包内有很多重要的类,包括: ...
- Special-Judge模板
SPJ模板 放一篇\(SPJ\)(\(Special-Judge\))的模板. 注意,仅适用于\(Lemon\). 并不适用于洛谷. 代码:@zcs0724 #include <bits/std ...
- 重构与模式 (Joshua Kerievsky 著)
第1章 本书的写作缘由 第2章 重构 第3章 模式 第4章 代码坏味 第5章 模式导向的重构目录 第6章 创建 第7章 简化 第8章 泛化 第9章 保护 第10章 聚集操作 第11章 实用重构 参考文 ...
- webrtc笔记(3): 多人视频通讯常用架构Mesh/MCU/SFU
问题:为什么要搞这么多架构? webrtc虽然是一项主要使用p2p的实时通讯技术,本应该是无中心化节点的,但是在一些大型多人通讯场景,如果都使用端对端直连,端上会遇到很带宽和性能的问题,所以就有了下图 ...
- 物联网架构成长之路(44)-Docker私有仓库Harbor
0. 前言 安装docker.docker-compose,这些在我以前的博客讲过,这里就不继续说明了,有需要的可以参考我之前的博客. https://www.cnblogs.com/wunaozai ...
- Vue.js 源码分析(二十九) 高级应用 transition-group组件 详解
对于过度动画如果要同时渲染整个列表时,可以使用transition-group组件. transition-group组件的props和transition组件类似,不同点是transition-gr ...
- 基于MicroPython结合ESP8266模块实现TCP通信(AT指令版)
转载请注明文章来源,更多教程可自助参考docs.tpyboard.com,QQ技术交流群:157816561,公众号:MicroPython玩家汇 实验目的 - 学习ESP8266模块(ESP-01) ...
- Kubernetes 有状态与无状态介绍
Kubernetes 有状态与无状态介绍 无状态:deployment - 认为所有pod都是一样的,不具备与其他实例有不同的关系. - 没有顺序的要求. - 不用考虑再哪个Node运行. - 随意扩 ...
- Redis学习记录及Jedis代码示例
文章目录 二.Redis简介 三.Redis安装 1. 下载并解压安装 2. 安装C语言编译环境 3. 修改安装位置 4. 编译安装 5.启动Redis服务器 ①默认启动 ②定制配置项启动 [1]准备 ...
- Java编程基础——流程控制
Java编程基础——流程控制 摘要:本文主要介绍Java编程中的流程控制语句. 分类 流程控制指的是在程序运行的过程中控制程序运行走向的方式.主要分为以下三种: 顺序结构:从上到下依次执行每条语句操作 ...