PAT乙级真题

1008 数组元素循环右移问题

题目描述

image

代码实现

Java

import java.io.*;

public class Main {
	static BufferedReader in = new BufferedReader(new InputStreamReader(System.in));

	public static void main(String[] args) throws IOException {
		String[] s=in.readLine().split(" ");
		int n=Integer.parseInt(s[0]),offset=Integer.parseInt(s[1])%n;
		int[] a=new int[n];
		s=in.readLine().split(" ");
		for(int i=0; i<n; i++)a[i]=Integer.parseInt(s[i]);
		if(offset==0){
			for(int i=0; i<n; i++)System.out.print(a[i]+(i!=n-1?" ":""));
		}else{
			for(int i=n-offset;i<n;i++)System.out.print(a[i]+" ");
			for(int i=0;i<n-offset;i++)System.out.print(a[i]+(i!=n-offset-1?" ":""));
		}
		
	}

}

1013 数素数

题目描述

image

代码实现

Java

import java.io.*;
import java.util.*;
public class Main {
	static BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
	public static void main(String[] args) throws IOException {
		int N=(int)1e5+4730;
		int[] prime=new int[N];
		int cnt=0;
		boolean[] isp=new boolean[N];
		Arrays.fill(isp, true);
		isp[0]=false; isp[1]=false;
		for(int i=2; i<N; i++){
			if(isp[i]) prime[cnt++]=i;
			for(int j=0; j<cnt&&i*prime[j]<N; j++){
				isp[i*prime[j]]=false;
				if(i%prime[j]==0)break;
			}
		}
		String[] s=in.readLine().split(" ");
		int a=Integer.parseInt(s[0]),b=Integer.parseInt(s[1]);
		for(int i=a-1,j=1; i<=b-1; i++){
			System.out.print(prime[i]+(i!=b-1?(j++%10==0?"\n":" "):""));
		}
	}

}


1014 福尔摩斯的约会

题目描述

image

代码实现

Java

import java.io.*;
import java.util.*;
public class Main {
	static BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
	public static void main(String[] args) throws IOException {
		String[] day={"MON","TUE","WED","THU","FRI","SAT","SUN"};
		String s1=in.readLine(),s2=in.readLine();
		String s3=in.readLine(),s4=in.readLine();
		int len1=Math.min(s1.length(), s2.length()),len2=Math.min(s3.length(), s4.length());
		int i=0;
		StringBuffer res=new StringBuffer();
		char tmp;
		while(i<len1){
			tmp=s1.charAt(i);
			if(tmp==s2.charAt(i)&&tmp>='A'&&tmp<='G'){
				res.append(day[tmp-65]+" "); i++; break;
			}
			i++;
		}
		while(i<len1){
			tmp=s1.charAt(i);
			if(tmp==s2.charAt(i)&&((tmp>='0'&&tmp<='9')||(tmp>='A'&&tmp<='N'))){
				int ot=tmp>='A'&&tmp<='N'?tmp-55:tmp-'0';
				res.append((ot<10?"0"+ot:ot)+":"); break;
			}
			i++;
		}
		i=0;
		while(i<len2){
			tmp=s3.charAt(i);
			if(tmp==s4.charAt(i)&&tmp>='A'&&tmp<='z'){
				res.append((i<10?"0"+i:i)); break;
			}
			i++;
		}
		System.out.println(res);
	}

}


1020 月饼

题目描述

image

代码实现

Java

import java.io.*;
import java.util.*;

public class Main {
	static BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
	static PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));
	static int N,maxd;
	public static void main(String[] args) throws IOException {
		String[] s=in.readLine().trim().split("\\s");
		N=Integer.parseInt(s[0]); maxd=Integer.parseInt(s[1]);
		MoonCake[] moon=new MoonCake[N];
		s=in.readLine().trim().split("\\s");
		String[] s1=in.readLine().trim().split("\\s");
		for(int i=0; i<N; i++){
			moon[i]=new MoonCake(Double.parseDouble(s[i]),Double.parseDouble(s1[i]));
		}
		Arrays.sort(moon);
		double sum=0.0;
		int i=0;
		while(maxd>0&&i<N){
			if(maxd<=moon[i].num){ 
				sum+=maxd*moon[i].basic;
				maxd=0;
			}
			else{ 
				sum+=moon[i].total_price;
				maxd-=moon[i].num;
			}
			i++; 
		}
		out.printf("%.2f", sum);
		out.flush();
	}

}
class MoonCake implements Comparable<MoonCake>{
	double num,total_price,basic;
	

	public MoonCake(double num, double total_price) {
		super();
		this.num = num;
		this.total_price = total_price;
		this.basic=total_price/num;
	}

	@Override
	public int compareTo(MoonCake o) {
		return (int) (10*(o.basic-this.basic));
	}
	
}

1023 组个最小数

题目描述

image

代码实现

Java

import java.io.*;
import java.util.*;

public class Main {
	static BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
	static PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));
	public static void main(String[] args) throws IOException {
		String[] s=in.readLine().split("\\s");
		int[] num=new int[60];
		int cnt=0;
		for(int i=0; i<10; i++){
			if(!s[i].equals("0"))
			for(int j=0; j<Integer.parseInt(s[i]); j++)num[cnt++]=i;
		}
		StringBuffer zero=new StringBuffer(),nomal=new StringBuffer();
		for(int i=0; i<cnt; i++){
			if(num[i]==0)zero.append(num[i]);
			else nomal.append(num[i]);
		}
		nomal.insert(1, zero.toString());
		out.println(nomal);
		out.flush();
	}

}

1025 反转链表

题目描述

image
image

代码实现

Java

import java.io.*;

public class _1025_反转链表 {
	static BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
	static PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));
	static int init,N,K;	//首结点地址	结点数	反转数
	public static void main(String[] args) throws IOException {
		// 输入
		String[] s=in.readLine().split("\\s");
		init=Integer.parseInt(s[0]); N=Integer.parseInt(s[1]);
		ad_Node[] no=new ad_Node[(int)1e5];		//散列记录
		K=Integer.parseInt(s[2]);
		int address;
		for(int i=0; i<N; i++){
			s=in.readLine().split("\\s");
			address=Integer.parseInt(s[0]);
			no[address]=new ad_Node(address,Integer.parseInt(s[1]),Integer.parseInt(s[2]));
		}
		
		//初始化链表
		ad_Node[] origin=new ad_Node[(int)1e5+10];
		int cnt=0;//	实际结点数
		address=init;	// 用于迭代地址
		while(address!=-1){
			origin[cnt++]=no[address];
			address=no[address].next_ad;
		}
		
		//反转链表		双指针对称交换
		ad_Node temp;
		int r;
		for(int i=K-1; i<cnt; i+=K){
			r=i;
			for(int j=i-K+1; j<r; j++,r--){
				temp=origin[r];
				origin[r]=origin[j];
				origin[j]=temp;
			}
		}
//		Stack<ad_Node> st=new Stack<>();
//		for(int i=0; i+K<=cnt; i+=K){
//			for(int j=i; j<i+K; j++) st.push(origin[j]);
//			for(int j=i; j<i+K; j++) origin[j]=st.pop();
//		}
		
		//输出
		for (int i = 0; i < cnt-1; i++) {// next_ad 即为下一个结点的地址,反转过程中不用变
            out.printf("%05d %d %05d\n",origin[i].address,origin[i].data,origin[i+1].address);
        }
        out.printf("%05d %d -1\n",origin[cnt-1].address,origin[cnt-1].data);
		out.flush();
	}

}
class ad_Node {
	int address,data,next_ad;
	public ad_Node(int address, int data, int next_ad) {
		this.address = address;
		this.data = data;
		this.next_ad = next_ad;
	}
	
}

python

import sys


class Node:
    address: int
    data: int
    next: int

    def __init__(self, address, data, next_ads):
        self.address = address
        self.data = data
        self.next = next_ads


init, N, K = map(int, sys.stdin.readline().split())
no = [Node for i in range(int(1e5))]

for i in range(N):
    a = list(map(int, sys.stdin.readline().split()))
    no[a[0]] = Node(a[0], a[1], a[2])

origin = [Node for i in range(int(1e5) + 10)]
cnt = 0
ads = init

while ads != -1:
    origin[cnt] = no[ads]
    ads = no[ads].next
    cnt += 1

# 双指针对称交换
# for i in range(K-1, cnt, K):
#     r = i
#     j = i - K + 1
#     while j < r:
#         temp = origin[r]
#         origin[r] = origin[j]
#         origin[j] = temp
#         r -= 1
#         j += 1

# 栈
stack = []
for i in range(0, cnt-K+1, K):
    for j in range(i, i+K):
        stack.append(origin[j])
    for j in range(i, i+K):
        origin[j] = stack.pop()


for i in range(cnt - 1):
    print("{:05d} {:d} {:05d}".format(origin[i].address, origin[i].data, origin[i + 1].address))
print("{:05d} {:d} {}".format(origin[cnt - 1].address, origin[cnt - 1].data, -1))

1027 打印沙漏

题目描述

image
image

代码实现

Java

import java.io.*;

public class Main {
	static BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
	static PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));
	public static void main(String[] args) throws IOException {
		String[] s=in.readLine().split(" ");
		int n=Integer.parseInt(s[0]);
		int l=1,r=23,mid=0;
		while(l<r){
			mid=(l+r+1)>>1;
			if((mid<=1?1:1+2*(mid-1)*(mid+1))<=n) l=mid;
			else r=mid-1;
		}
		int i=r,sum=2*r-1;
		while(i>0){
			for(int m=0; m<(sum-(2*i-1))>>1; m++) out.print(' ');
			for(int j=1; j<=2*i-1; j++) out.print(s[1]);
			i--;
			out.println();
		}
		
		i=2;
		while(i<=r){
			for(int m=0; m<(sum-(2*i-1))/2; m++) out.print(' ');
			for(int j=1; j<=2*i-1; j++) out.print(s[1]);
			i++;
			out.println();
		}
		out.println(n-(r<=1?1:1+2*(r-1)*(r+1)));
		out.flush();
	}

}

python

import sys


def total(x):
    return 1 + 2 * (x - 1) * (x + 1)


def item(x):
    return 2 * x - 1


n, s = map(str, sys.stdin.readline().split())
n = int(n)
l, r, mid = 1, 23, 0
while l < r:
    mid = (l + r + 1) // 2
    if total(mid) <= n:
        l = mid
    else:
        r = mid - 1
i, num = r, item(r)
while i > 0:
    print((num - item(i)) // 2 * ' ', end='')
    print(item(i) * s)
    i -= 1
i = 2
while i <= r:
    print((num - item(i)) // 2 * ' ', end='')
    print(item(i) * s)
    i += 1
print(n - total(r))

1028 人口普查

题目描述

image

代码实现

Java

import java.io.*;


public class Main {
	static BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
	static PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));
	public static void main(String[] args) throws IOException {
		int y,m,d;
		int n=Integer.parseInt(in.readLine()),num=0;
		String[] s;
		Birth[] a=new Birth[(int)1e5+10];
		Birth old=new Birth(),young=new Birth();
		while(n-->0){
			s=in.readLine().split("\\s+");
			y=Integer.parseInt(s[1].substring(0, 4));
			m=Integer.parseInt(s[1].substring(5, 7));
			d=Integer.parseInt(s[1].substring(8));
			if(!check(y,m,d)) continue;
			a[num++]=new Birth(y,m,d,s[0]);
			if(num==1){
				old=new Birth(a[num-1].year,a[num-1].month,old.data=a[num-1].data,a[num-1].name);
				young=new Birth(a[num-1].year,a[num-1].month,old.data=a[num-1].data,a[num-1].name);
			} 
			else{
				if(shape(a[num-1])<shape(old)){
					old.year=a[num-1].year; old.month=a[num-1].month; 
					old.data=a[num-1].data; old.name=a[num-1].name;
				}
				if(shape(a[num-1])>shape(young)){
					young.year=a[num-1].year; young.month=a[num-1].month; 
					young.data=a[num-1].data; young.name=a[num-1].name;
				}
			}
		}
		
		out.printf("%d %s %s",num,old.name,young.name);
		out.flush();
	}
	private static int shape(Birth b) {
		return 10000*b.year+100*b.month+b.data;
	}
	private static boolean check(int y, int m, int d) {
		if(y<1814||y>2014) return false;
		if((y==1814&&m<9)||(y==2014&&m>9)) return false;
		if((y==1814&&m==9&&d<6)||(y==2014&&m==9&&d>6)) return false;
		return true;
	}

}
class Birth{
	int year,month,data;
	String name;
	public Birth(){}
	public Birth(int year, int month, int data, String name) {
		this.year = year;
		this.month = month;
		this.data = data;
		this.name = name;
	}
	
}

python

import sys


class Birth:
    name: str
    shape: int

    def __init__(self, name, shape):
        self.name = name
        self.shape = shape


num = 0
n = int(input())
a = [Birth for i in range(10 + int(1e5))]
old, young = Birth("", 20140906), Birth("", 18140906)


def check(y, m, d):
    if y < 1814 or y > 2014:
        return False
    if (y == 1814 and m < 9) or (y == 2014 and m > 9):
        return False
    if (y == 1814 and m == 9 and d < 6) or (y == 2014 and m == 9 and d > 6):
        return False
    return True


for i in range(n):
    s = list(map(str, sys.stdin.readline().split()))
    y, m, d = int(s[1][0:4]), int(s[1][5:7]), int(s[1][8:])
    if not check(y, m, d):
        continue
    a[num] = Birth(s[0], int(1e4)*y+100*m+d)
    if a[num].shape < old.shape:
        old.shape = a[num].shape
        old.name = a[num].name
    if a[num].shape > young.shape:
        young.shape = a[num].shape
        young.name = a[num].name
    num += 1
if num ==0:
    print(0)
else:
    print("{} {} {}".format(num, old.name, young.name))

1029 旧键盘

题目描述

image

代码实现

Java

import java.io.*;
import java.util.*;

public class Main {
	static BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
	static PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));

	public static void main(String[] args) throws IOException {
		String[] test=in.readLine().split("");
		String res=in.readLine();
		Set<String> set=new HashSet<>();
		for(String c:test){
			if(!res.contains(c)&&!set.contains(c.toUpperCase())){
				out.print(c.toUpperCase());
				set.add(c.toUpperCase());
			}
		}
		out.flush();
	}

}

python

import sys

tst, res = sys.stdin.readline(), sys.stdin.readline()
a = set()
for c in tst:
    if c not in res and c.upper() not in a:
        print(c.upper(), end='')
        a.add(c.upper())

1030 完美数列

题目描述

image

代码实现

Java

import java.io.*;
import java.util.*;
// 终点线性递减,起点二分查找
/**
 * 6 3 1 7 8 9 20 1000
 */
public class _1030_完美数列 {
	static BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
	static PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));

	public static void main(String[] args) throws IOException {
		String[] s = in.readLine().split("\\s");
		int N = Integer.parseInt(s[0]);
		long p = Long.parseLong(s[1]);
		long[] a = new long[N];
		s = in.readLine().split("\\s");
		for (int i = 0; i < N; i++)
			a[i] = Long.parseLong(s[i]);
		Arrays.sort(a);
		int l, mid, r;
		int len = -1;
		for (int j = N - 1; j >= 0; j--) {
			l = 0;
			r = j;
			while (l < r) {
				mid = (l + r) >> 1;
				if (a[mid] * p >= a[j])
					r = mid;
				else
					l = mid + 1;
			}
			len = Math.max(len, j - r + 1);
		}
		out.println(len);
		out.flush();
	}

}

python

import sys

N, p = map(int, sys.stdin.readline().split())
a = list(map(int, sys.stdin.readline().split()))
a.sort()
len = -1
i = N - 1
while i >= 0:
    l, r = 0, i
    while l < r:
        mid = (l + r) // 2
        if a[mid] * p >= a[i]:
            r = mid
        else:
            l = mid + 1
    len = max(len, i-r+1)
    i -= 1
print(len)

1034 有理数四则运算

题目描述

image

代码实现

Java

import java.io.*;

public class _1034_有理数四则运算 {
    static BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
    static PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));

    public static void main(String[] args) throws IOException {
        // 读取输入的两个有理数
        String[] s = in.readLine().split("\\s");
        String[] ss = s[0].split("/");
        Num n1 = new Num(Integer.parseInt(ss[0]), Integer.parseInt(ss[1]));
        ss = s[1].split("/");
        Num n2 = new Num(Integer.parseInt(ss[0]), Integer.parseInt(ss[1]));

        // 依次进行加法、减法、乘法和除法运算,并输出结果
        out.println(add(n1, n2));
        out.println(subtract(n1, n2));
        out.println(multiply(n1, n2));
        out.println(divide(n1, n2));
        out.flush();
    }

    private static String divide(Num n1, Num n2) {
        // 计算有理数相除的结果
        return n1.union(n2, " / ") + new Num(n1.a * (n2.a < 0 ? -1 : 1) * n2.b, n1.b * n2.a * (n2.a < 0 ? -1 : 1)).num;
    }

    private static String multiply(Num n1, Num n2) {
        // 计算有理数相乘的结果
        return n1.union(n2, " * ") + new Num(n1.a * n2.a, n2.b * n1.b).num;
    }

    private static String subtract(Num n1, Num n2) {
        // 计算有理数相减的结果
        long fmu = lcm(n1.b, n2.b);
        return n1.union(n2, " - ") + new Num(fmu / n1.b * n1.a - fmu / n2.b * n2.a, fmu).num;
    }

    private static String add(Num n1, Num n2) {
        // 计算有理数相加的结果
        long fmu = lcm(n1.b, n2.b);
        return n1.union(n2, " + ") + new Num(fmu / n1.b * n1.a + fmu / n2.b * n2.a, fmu).num;
    }

    // 计算两个数的最小公倍数
    static long lcm(long a, long b) {
        return a * b / gcd(a, b);
    }

    // 计算两个数的最大公约数
    static long gcd(long a, long b) {
        return b == 0 ? a : gcd(b, a % b);
    }
}

class Num {
    long a, b, k, sim_a, sim_b; // 分子 分母 整数部分 最简分子 最简分母
    boolean flag_k = true; // 是否是假分数
    StringBuffer num = new StringBuffer();

    public Num(long a, long b) {
        this.a = a;
        this.b = b;

        // 处理除数为0的情况
        if (b == 0) {
            num.append("Inf");
            return;
        }

        // 计算整数部分、最简分子和最简分母
        this.k = a / b;
        sim_a = Math.abs(a) < b ? a : a % b;
        long m = gcd(Math.abs(sim_a), b);
        sim_a = sim_a / m;
        sim_b = this.b / m;

        // 生成有理数的字符串表示
        if (this.k != 0)
            num.append((this.k < 0 ? "(" : "") + this.k);
        else
            flag_k = false;
        if (sim_a != 0)
            num.append((flag_k ? " " : (sim_a < 0 ? "(" : "")) + (flag_k && this.k < 0 ? -1 : 1) * sim_a + "/" + sim_b);
        else if (!flag_k)
            num.append(0);
        if ((flag_k && this.k < 0) || (!flag_k && sim_a < 0))
            num.append(")");
    }

    public String union(Num n2, String op) {
        StringBuffer res = new StringBuffer();
        res.append(num + op + n2.num + " = ");
        return res.toString();
    }

    static long gcd(long a, long b) {
        return b == 0 ? a : gcd(b, a % b);
    }

}

python

import sys
import math


def gcd(a, b):
    return a if b == 0 else gcd(b, a % b)


def lcm(a, b):
    return a * b // gcd(a, b)


class Num:
    a: int
    b: int
    k: int
    sim_a: int
    sim_b: int
    flag_k = True
    num = ""

    def __init__(self, a, b):
        self.a, self.b = a, b
        if b == 0:
            self.num = "".join("Inf")
            return
        self.k = int(a / b)
        self.sim_a = a if math.fabs(self.a) < self.b else (a % b if a>=0 else -1*a%b)
        m = gcd(int(math.fabs(self.sim_a)), b)
        self.sim_a = self.sim_a // m
        self.sim_b = self.b // m
        strs = []
        if self.k != 0:
            strs.append(("(" if self.k < 0 else "") + str(self.k))
        else:
            self.flag_k = False
        if self.sim_a != 0:
            strs.append((" " if self.flag_k else ("(" if self.sim_a < 0 else "")) + str(
                int(math.fabs(self.sim_a)) if self.flag_k and self.k < 0 else self.sim_a) + "/" + str(self.sim_b))
        elif not self.flag_k:
            strs.append("0")
        if (self.flag_k and self.k < 0) or (not self.flag_k and self.sim_a < 0):
            strs.append(")")
        self.num = "".join(strs)

    def union(self, n2, op):
        return "".join(self.num + op + n2.num + " = ")


def divide(n1: Num, n2: Num):
    return n1.union(n2, " / ") + Num(n1.a*(-1 if n2.a < 0 else 1)*n2.b, n1.b*n2.a*(-1 if n2.a < 0 else 1)).num


def multiply(n1: Num, n2: Num):
    return n1.union(n2, " * ")+Num(n1.a*n2.a, n2.b*n1.b).num


def subtract(n1: Num, n2: Num):
    fmu = lcm(n1.b, n2.b)
    return n1.union(n2, " - ")+Num(fmu//n1.b*n1.a-fmu//n2.b*n2.a, fmu).num


def add(n1: Num, n2: Num):
    fmu = lcm(n1.b, n2.b)
    return n1.union(n2, " + ")+Num(fmu//n1.b*n1.a+fmu//n2.b*n2.a, fmu).num


s1, s2 = map(str, sys.stdin.readline().split())
s1, s2 = s1.split("/"), s2.split("/")
n1, n2 = Num(int(s1[0]), int(s1[1])), Num(int(s2[0]), int(s2[1]))
print(add(n1, n2))
print(subtract(n1, n2))
print(multiply(n1, n2))
print(divide(n1, n2))


1037 在霍格沃茨找零钱

题目描述

image

代码实现

Java

import java.io.*;

public class Main {
	static BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
	static PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));

	public static void main(String[] args) throws IOException {
		String[] s=in.readLine().split("\\s");
		String[] s1=s[0].split("\\."),s2=s[1].split("\\.");
		int[] P=new int[3],A=new int[3];
		P[0]=Integer.parseInt(s1[0]);
		P[1]=Integer.parseInt(s1[1]);
		P[2]=Integer.parseInt(s1[2]);
		A[0]=Integer.parseInt(s2[0]);
		A[1]=Integer.parseInt(s2[1]);
		A[2]=Integer.parseInt(s2[2]);
		StringBuffer str=new StringBuffer();
		boolean flag=check(P,A);
		int gall=flag?A[0]-P[0]:P[0]-A[0],
			sic=flag?A[1]-P[1]:P[1]-A[1],
			knut=flag?A[2]-P[2]:P[2]-A[2];
		if(knut<0){ 
			knut+=29; sic-=1;
		}
		if(sic<0){
			sic+=17; gall-=1;
		}
		if(!flag) str.append("-");
		str.append(gall+"."+sic+"."+knut);
		out.println(str); out.flush();
	}

	private static boolean check(int[] p, int[] a) {
		if(a[0]!=p[0]) return a[0]>p[0];
		else if(a[1]!=p[1]) return a[1]>p[1];
		else if(a[2]!=p[2]) return a[2]>p[2];
		return true;
	}

}

1043 输出PATest

题目描述

image

代码实现

Java

import java.io.*;

public class Main {
	static BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
	static PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));
	static boolean[] visit;
	static char[] dir;

	public static void main(String[] args) throws IOException {
		String s = in.readLine().trim(), bas = "PATest";
		int n = s.length(), cnt = 0;
		char[] ss = new char[n];
		char c = 0;
		for (int i = 0; i < n; i++) {
			c = s.charAt(i);
			if (bas.contains(c + ""))
				ss[cnt++] = c;
		}
		visit = new boolean[cnt];
		dir = bas.toCharArray();
		int N = cnt;
//		while (N != 0) {
//			for (int i = 0; i < 6; i++) {
//				for (int j = 0; j < cnt; j++) {
//					if (!visit[j] && ss[j] == dir[i]) {
//						out.print(ss[j]);
//						visit[j] = true;
//						N--;
//						break;
//					}
//				}
//			}
//		}
		dfs(N,cnt,ss,"");
//		out.flush();
	}

	private static void dfs(int n, int cnt, char[] ss,String str) {
		if(n==0){
			out.println(str);
			out.flush();
			return;
		}
		for (int i = 0; i < 6; i++) {
			for (int j = 0; j < cnt; j++) {
				if (!visit[j] && ss[j] == dir[i]) {
					str=str+ss[j];
					visit[j] = true;
					n--;
					break;
				}
			}
		}
		dfs(n,cnt,ss,str);
	}

}

1049 数列的片段和

题目描述

image

代码实现

python

import sys
from decimal import Decimal

N = int(input())
a = list(map(Decimal, sys.stdin.readline().split()))
sum = [Decimal for i in range(N)]
for i in range(N):
    sum[i] = a[i] + (0 if i - 1 < 0 else sum[i - 1])
sum_0 = 0
for i in range(N):
    sum_0 += sum[i]
total = sum_0
for i in range(1, N):
    sum_0 -= a[i-1] * (N-i+1)
    total += sum_0
print("{:.2f}".format(total))

posted @ 2023-07-19 12:22  简渡  阅读(90)  评论(0)    收藏  举报