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 如 ...
随机推荐
- layim+signalr2.0+mongodb在线轻聊版解决方案(可提供演示)
本内容有版权限制,仅提供学习交流参考等等,请勿随便转载或者代码商用. /** layui-v2.1.5 MIT License By http://www.layui.com */; layu ...
- ThreadPoolExecutor 线程池 简单解析
jdk1.8 ThreadPoolExecutor ThreadPoolExecutor实际就是java的线程池,开发常用的Executors.newxxxxx()来创建不同类型和作用的线程池,其底部 ...
- Kubernetes 遇到的问题
Kubernetes 遇到的问题 k8s 版本 k8s v1.13.5 docker 18.09.2 问题一 kubelet 报错 May 22 10:14:42 test-ops-k8s-03 ku ...
- 探索ASP.Net Core 3.0系列六:ASP.NET Core 3.0新特性启动信息中的结构化日志
前言:在本文中,我将聊聊在ASP.NET Core 3.0中细小的变化——启动时记录消息的方式进行小的更改. 现在,ASP.NET Core不再将消息直接记录到控制台,而是正确使用了logging 基 ...
- 如何自动生成 Entity Framework 的 Mapping 文件?
Program.cs using System; using System.IO; using System.Text; using System.Text.RegularExpressions; n ...
- VOC数据集 目标检测
最近在做与目标检测模型相关的工作,很多都要求VOC格式的数据集. PASCAL VOC挑战赛 (The PASCAL Visual Object Classes )是一个世界级的计算机视觉挑战赛, P ...
- php 5.5 编译安装
链接:https://pan.baidu.com/s/1Iy5kdugWqmvtsrYG0WYAdA 提取码:knk9 上面的链接 php5.5.8 编译安装的包 ./configure --pre ...
- C# 实现 奇数偶数排序,奇数在前,偶数在后
public static void SortByOddAndEven(int []arr) { for (int i = 0; i < arr.Length; i++) { for (int ...
- Asp.Net真分页技术
最近学校要做课题,闲来没事研究了下Asp.net的分页,我使用Repeater进行数据的绑定,每次从数据库读取到8条数据填充到Repeater中,这样搞可以降低数据库的压力,提高效率. 效果图如下: ...
- C# 跨线程访问UI不报错,必须使用Invoke。
代码有时跨线程访问UI,修改按钮Enable属性不报异常.调试发现修改按钮属性的线程是Background,执行不报异常. 在窗体构造中添加 Control.CheckForIllegalCrossT ...