A.解开束缚缠丝II
题意:
在一堆字符里面找出最长的回文串,并把它的长度输出出来。
思路:
这道题,一开始想的是把所有情况都列举出来,然后一一判断是不是回文串。后面根据第二个样例才想明白,原来根本不需要那样,这道题要我们求的是长度。只需要判断这堆字符里面有多少重复的字符就可以了。如果没有重复的,那最长也就只能是1,如果有一对,中间随便加一个字符就是回文串了。但如果有奇数个同样的字符,那么多出来的一个是不需要的,我们减去即可。因为如果有两个多出来的就会影响判断。
代码:
点击查看代码
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner .nextInt();
while(n-->0) {
int[] arr = new int[145];
int m = scanner.nextInt();
char[] ch1 = new char[m];
for(int i = 0 ;i < m;i++) {
ch1[i] = scanner.next().charAt(0);
}
int x = 0;
for(int i = 0;i < m;i++) {
x = ch1[i];
arr[x]++;
}
int sum = 0;
for(int i = 0;i < 145;i++) {
if(arr[i]>1&&arr[i]%2!=0) {
sum+=arr[i]-1;
}else if(arr[i]>1&&arr[i]%2==0) {
sum+=arr[i];
}
}
if(sum==0) {
System.out.println(1);
}else if(sum==m){
System.out.println(sum);
}else {
System.out.println(sum+1);
}
}
}
}
B.好想听肆宝唱歌啊
思路:
就是将两个数组同时排好序,排序的时候我们用快排,然后根据题目说的来找就可以了,注意是倒着找,因为喜爱程度越大的,就会越被先点。
代码:
点击查看代码
import java.util.*;
public class Main {
static int[] arr;
static String[] str;
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
arr = new int[n];
str = new String[n];
for(int i = 0;i < n;i++) {
arr[i] = scanner.nextInt();
str[i] = scanner.next();
}
int k = scanner.nextInt();
quick_sort(arr,0,n-1);
int g = n-k-1;
System.out.println(str[g]);
}
public static void quick_sort(int[] q,int l,int r) {
if(l>=r) return;
int x = q[(l+r)/2],i = l-1,j = r+1;
while(i<j) {
do i++; while(q[i]<x);
do j--; while(q[j]>x);
if(i<j) {
int temp = q[i];
q[i] = q[j];
q[j] = temp;
String stemp = str[i];
str[i] = str[j];
str[j] = stemp;
}
}
quick_sort(q,l,j);
quick_sort(q,j+1,r);
}
}
C.毁灭凤凰人
思路:
这里主要考虑两种情况,一是先击败,再除外;二是弃一张牌直接除外。
还有就是仔细读题,注意防御那里的判断条件与攻击那里不一样。
代码:
点击查看代码
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
int m = scanner.nextInt();
int[] arr = new int[n];
int[] arr1 = new int[n];
for(int i = 0;i < n;i++) {
arr[i] = scanner.nextInt();
if(arr[i]==0) {
arr1[i] = scanner.nextInt();
}
}
for(int i = 0;i < n-1;i++) {
if(arr[i]==0&&m==0&&arr1[i]>=2500) {
for(int j = 0;j<n;j++) {
if(arr[j]==1) {
System.out.println("haoye");
return;
}
}
}else if(arr[i]==0&&m==1&&arr1[i]>2100) {
for(int j = 0;j<n;j++) {
if(arr[j]==1) {
System.out.println("haoye");
return;
}
}
}else if(arr[i]==2&&n>=2) {
System.out.println("haoye");
return;
}
}
System.out.println("QAQ");
}
}
D.欢迎来到杭师大
题意:
这道题之间按题目输出即可。
E.Ayanoto 变形记
题目:
只要是步数不为0,都是可以跳到原点的。最开始考虑n和m的关系,其实都是可以到的。
代码:
点击查看代码
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int T = scanner.nextInt();
boolean flag = false;
while(T-->0) {
int n = scanner.nextInt();
int x = scanner.nextInt();
if(x==0) {
System.out.println("no");
continue;
}else {
System.out.println("yes");
}
}
}
}
F.7 的意志
思路:
最开始想的是打乱了顺序的,后面发现其实是顺序固定了的,用指针扫描即可,但是优化得还不够,最后会超时。
代码:
点击查看代码
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int T = scanner.nextInt();
while(T-->0) {
int n = scanner.nextInt();
int[] arr = new int[n];
for(int i = 0;i < n;i++) {
arr[i] = scanner.nextInt();
}
int sum = 0;
int count = 0;
for(int i = 0;i < n;i++) {
sum = arr[i];
for(int j = i+1;j < n;j++) {
sum+=arr[j];
if(sum==7777) {
count++;
break;
}else if(sum>7777){
break;
}
}
}
System.out.println(count);
}
}
}