蓝桥杯题库 算法提高非vip部分(C++、Java)代码实现(101-200)

将定期更新蓝桥杯习题集的解题报告~

ADV-103 逆序排列

cpp:

#include <iostream>
using namespace std;
int a[25];
int main() {
    int i = 0, j, temp;
    while (cin >> temp) {
        if (temp == 0) break;
        a[i] = temp;
        i++;
    }
    if (i == 0)
        cout << endl;
    else {
        for (j = i - 1; j > 0; j--) cout << a[j] << " ";
        cout << a[0] << endl;
    }
    return 0;
}

java:

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int[] a = new int[20];
        for (int i = 0; i < a.length; i++) {
            a[i] = sc.nextInt();
            if(a[i]==0){
                break;
            }
        }
        for (int i = a.length-1; i >=0; i--) {
            if(a[i]==0){
                continue;
            }else if(i==0){
                System.out.print(a[i]);
            }else if(a[i-1]==0){
                System.out.print(a[i]);
            }else{
                System.out.print(a[i] + " ");
            }
        }
    }
}

ADV-112 c++_ch02_01

cpp:

#include<stdio.h>
int main()
{
	char a,e,i,o,u;
	a='a';
	e='e';
	i='i';
	o='o';
	u='u';
	printf("%d\n",a-32);
	printf("%d\n",e-32);
	printf("%d\n",i-32);
	printf("%d\n",o-32);
	printf("%d\n",u-32);
	printf("%d\n",a);
	printf("%d\n",e);
	printf("%d\n",i);
	printf("%d\n",o);
	printf("%d\n",u);
	return 0;
}

java:

public class Main {

	public static void main(String[] args) {
		char []a={'A','E','I','O','U','a','e','i','o','u'};
		for(int i=0;i<a.length;i++){
			System.out.println((int)a[i]);
		}
		System.out.println();
		
	}

}

ADV-120 6-17复数四则运算

cpp:

#include <stdio.h>
int main() {
    double a, b, c, d;
    double bb = 0.0;
    char op;
    scanf("%lf %lf %c %lf %lf", &a, &b, &op, &c, &d);
    bb = c * c + d * d;
    switch (op) {
        case 43:
            printf("%.0lf%+.0lfi\n", a + c, b + d);
            break;
        case 45:
            printf("%.0lf%+.0lfi\n", a - c, b - d);
            break;
        case 42:
            printf("%.0lf%+.0lfi\n", a * c - b * d, a * d + b * c);
            break;
        case 47: {
            if (bb != 0.0)
                if ((a * c + b * d) / bb < 0 && (a * c + b * d) / bb > -1)
                    printf("%.1lf%+.1lfi\n", (a * c + b * d) / bb,
                           (b * c - a * d) / bb);
                else
                    printf("%.0lf%+.0lfi\n", (a * c + b * d) / bb,
                           (b * c - a * d) / bb);
            else
                printf("error");
        } break;
    }
    return 0;
}

java:



import java.util.Scanner;

public
class Main {
    /**
     * @param args
     */
   public
    static void main(String[] args) {
        // TODO Auto-generated method stub
        Scanner reader = new Scanner(System.in);
        double a1 = reader.nextDouble();
        double b1 = reader.nextDouble();
        String str = reader.next();
        double a2 = reader.nextDouble();
        double b2 = reader.nextDouble();

        double a = 0;
        double b = 0;
        boolean flag = true;

        if (str.equals("+")) {
            a = a1 + a2;
            b = b1 + b2;
        } else if (str.equals("-")) {
            a = a1 - a2;
            b = b1 - b2;
        } else if (str.equals("*")) {
            if ((a1 == a2) && (b1 == -b2)) {
                System.out.println(a1 * a1 + b1 * b1);
            } else {
                a = a1 * a2 - b1 * b2;
                b = a1 * b2 + b1 * a2;
            }
        } else if (str.equals("/")) {
            if (a2 == 0 && b2 == 0) {  //无法计算时输出字符串"error"
                System.out.println("error");
                flag = false;
            } else {
                double c = a2 * a2 + b2 * b2;
                a = (a1 * a2 + b1 * b2) / c;  //此题做除法要用double
                b = (b1 * a2 - a1 * b2) / c;
            }
        }
        if (flag) {
            if (b < 0) {                              //虚部为负
                if ((a - Math.round(a)) == 0) {       //如果a=3.0
                    System.out.print(Math.round(a));  //只输出整数部分,3
                } else {
                    System.out.print(a);  //如果a=3.1,则输出3.1
                }
                if ((b - Math.round(b)) == 0) {
                    System.out.print(Math.round(b));
                } else {
                    System.out.print(b);
                }
            } else {  //虚部为正
                if ((a - Math.round(a)) == 0) {
                    System.out.print(Math.round(a));
                } else {
                    System.out.print(a);
                }
                System.out.print("+");
                if ((b - Math.round(b)) == 0) {
                    System.out.print(Math.round(b));
                } else {
                    System.out.print(b);
                }
            }
            System.out.println("i");
        }
    }
}

ADV-123 概率计算

cpp:

#include <conio.h>
#include <stdio.h>
double d[101][10001];
int n, a, b, x;

int main() {
    int i, j, k;
    scanf("%d%d%d%d", &n, &a, &b, &x);
    for (i = a; i <= b; i++) d[1][i] = 1.0 / (b - a + 1);
    for (i = 2; i <= n; i++)
        for (j = i * a; j <= i * b; j++)
            for (k = a; k <= b; k++) d[i][j] += d[1][k] * d[i - 1][j - k];
    printf("%.4f", d[n][x]);
    return 0;
}

java:


import java.util.Scanner;

public
class Main {
   public
    static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        double[][] dp = new double[110][11000];
        int n = sc.nextInt();
        int a = sc.nextInt();
        int b = sc.nextInt();
        int x = sc.nextInt();
        double p = 1.0 / (b - a + 1);
        for (int i = 1; i <= n; i++) {
            for (int j = a * i; j <= b * i && j <= x; j++) {
                if (i == 1) {
                    dp[i][j] = p;
                } else {
                    double pp = 0;
                    for (int z = a; z <= b; z++) {
                        if (j >= z) pp += dp[i - 1][j - z] * p;
                    }
                    dp[i][j] = pp;
                }
            }
        }
        System.err.printf("%.4f", dp[n][x]);
    }
}

ADV-127 日期计算

cpp:

#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
bool Is(int y) {
    if (y % 400 == 0) return 1;
    if (y % 100 == 0) return 0;
    if (y % 4 == 0) return 1;
    return 0;
}
int Month[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
struct date {
    int yyyy, mm, dd;
    date(int y = 0, int m = 0, int d = 0) {
        yyyy = y;
        mm = m;
        dd = d;
    }
    bool operator<(const date &rhs) const {
        if (yyyy != rhs.yyyy) return yyyy < rhs.yyyy;
        if (mm != rhs.mm) return mm < rhs.mm;
        return dd < rhs.dd;
    }
    bool operator==(const date &rhs) const {
        return (!((*this) < rhs) && !(rhs < (*this)));
    }
    int operator-(const date &rhs) const {
        int ret = 0;
        date t = rhs;
        while (!(t == (*this))) {
            ret++;
            t.dd++;
            if (t.dd ==
                (t.mm == 2 ? Month[t.mm] + Is(t.yyyy) : Month[t.mm]) + 1) {
                t.dd = 1;
                t.mm++;
            }
            if (t.mm == 13) {
                t.yyyy++;
                t.mm = 1;
            }
        }
        return ret;
    }
};
int main() {
    date n, st(2011, 11, 11);
    while (cin >> n.yyyy >> n.mm >> n.dd) {
        int t = 0;
        if (n < st)
            t = -(st - n);
        else
            t = n - st;
        t = ((t % 7) + 7) % 7;
        int ans = (t + t);
        cout << ((5 + t + 6) % 7 + 1) << endl;
    }
}

java:

import java.util.Scanner;

public
class Main {
   public
    static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        int y = input.nextInt();
        int m = input.nextInt();
        int d = input.nextInt();
        int sum = getY(y);
        if (y < 2012) {
            sum -= getM(y, m, d);
            System.out.println(sum % 7 == 0 ? 7 : 7 - (sum % 7));
        } else {
            sum += getM(y, m, d);
            System.out.println(sum % 7 == 0 ? 7 : sum % 7);
        }
        input.close();
    }

   private
    static int getM(int y, int m, int d) {
        int sum = 0;
        for (int i = 1; i < m; i++) {
            if (i == 1 || i == 3 || i == 5 || i == 7 || i == 8 || i == 10 ||
                i == 12)
                sum += 31;
            if (i == 4 || i == 6 || i == 11 || i == 9) sum += 30;
            if (i == 2 && isRun(y)) sum += 29;
            if (i == 2 && !isRun(y)) sum += 28;
        }
        sum = sum + d - 1;
        return sum;
    }

   private
    static int getY(int year) {
        int sum = 0;
        if (year > 2012) {
            for (int i = 2012; i < year; i++) {
                if (isRun(i))
                    sum += 366;
                else
                    sum += 365;
            }
        } else {
            for (int i = year; i < 2012; i++)
                if (isRun(i))
                    sum += 366;
                else
                    sum += 365;
        }
        return sum;
    }

   private
    static boolean isRun(int y) {
        if (y % 400 == 0 || (y % 4 == 0 && y % 100 != 0)) return true;
        return false;
    }
}

ADV-141 判断名次

cpp:

#include <cstdio>
#include <cstring>
#include <iostream>

using namespace std;
int to[5];
int obj[5];
int par[5];
bool tar[5];
int position[5];
int rec[5];
int cnt;
bool cmp(int opr, int a, int b) {
    if (opr == 0)
        return a >= b;
    else if (opr == 1)
        return a <= b;
    else if (opr == 2)
        return a == b;
    else if (opr == 3)
        return a != b;
    else if (opr == 4)
        return a > b;
    else
        return a < b;
}
void judge() {
    bool tb = true;
    for (int i = 0; i < 5; i++) {
        if (position[i] % 2) {
            if (!cmp(to[i], position[obj[i]], par[i])) {
                tb = false;
                break;
            }
        } else {
            if (!cmp(5 - to[i], position[obj[i]], par[i])) {
                tb = false;
                break;
            }
        }
    }
    if (tb) {
        printf("%c%c%c%c%c\n", rec[0] + 'A', rec[1] + 'A', rec[2] + 'A',
               rec[3] + 'A', rec[4] + 'A');
        cnt++;
    }
}
void dfs(int num) {
    if (num == 5) {
        judge();
        return;
    }
    for (int i = 0; i < 5; i++) {
        if (!tar[i]) {
            position[i] = num;
            rec[num] = i;
            tar[i] = true;
            dfs(num + 1);
            tar[i] = false;
        }
    }
}
int main(int argc, char** argv) {
    memset(tar, false, sizeof tar);
    for (int i = 0; i < 5; i++) {
        char s[5], c1;
        scanf("%s", s);
        obj[i] = s[0] - 'A';
        if (strlen(s) == 4) {
            if (s[1] == '<')
                to[i] = 1;
            else if (s[1] == '!')
                to[i] = 3;
            else
                to[i] = 0;
            par[i] = s[3] - '0';
        } else {
            if (s[1] == '<')
                to[i] = 5;
            else if (s[1] == '=')
                to[i] = 2;
            else
                to[i] = 4;
            par[i] = s[2] - '0';
        }
        par[i] -= 1;
    }
    cnt = 0;
    dfs(0);
    printf("%d\n", cnt);
    return 0;
}

java:

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Scanner;

public
class Main {
    static String[] say = new String[5];
    static List<String> list = new ArrayList<String>();
   public
    static void main(String[] args) {
        // TODO Auto-generated method stub
        Scanner sc = new Scanner(System.in);
        for (int i = 0; i < say.length; i++) {
            say[i] = sc.next();
        }
        dfs(0, 5, new char[]{'A', 'B', 'C', 'D', 'E'});
        Collections.sort(list);
        for (int i = 0; i < list.size(); i++) {
            System.out.println(list.get(i));
        }
        System.out.println(list.size());
    }
    static void dfs(int start, int end, char[] c) {
        if (start == end) {
            String s = new String(c);
            if (judge(s)) {
                list.add(s);
            }
        }
        for (int i = start; i < end; i++) {
            char temp = c[start];
            c[start] = c[i];
            c[i] = temp;
            dfs(start + 1, end, c);
            temp = c[start];
            c[start] = c[i];
            c[i] = temp;
        }
    }
    static boolean judge(String s) {
        char num1 = s.charAt(0);
        char num3 = s.charAt(2);
        char num5 = s.charAt(4);

        String[] temp = new String[5];
        for (int i = 0; i < temp.length; i++) {
            temp[i] = say[i];
        }
        reverse(num1, temp);
        reverse(num3, temp);
        reverse(num5, temp);

        if (check(s, temp)) {
            return true;
        } else {
            return false;
        }
    }
    static boolean check(String s, String[] temp) {
        for (int i = 0; i < temp.length; i++) {
            String ss = temp[i];
            if (ss.length() == 3) {
                if (ss.charAt(1) == '>') {
                    int BeforeNum =
                        Integer.valueOf("" + ss.charAt(ss.length() - 1));
                    int RealNum = s.indexOf("" + ss.charAt(0)) + 1;
                    if (!(RealNum > BeforeNum)) {
                        return false;
                    }
                } else if (ss.charAt(1) == '<') {
                    int BeforeNum =
                        Integer.valueOf("" + ss.charAt(ss.length() - 1));
                    int RealNum = s.indexOf("" + ss.charAt(0)) + 1;
                    if (!(RealNum < BeforeNum)) {
                        return false;
                    }
                } else if (ss.charAt(1) == '=') {
                    int BeforeNum =
                        Integer.valueOf("" + ss.charAt(ss.length() - 1));
                    int RealNum = s.indexOf("" + ss.charAt(0)) + 1;
                    if (!(RealNum == BeforeNum)) {
                        return false;
                    }
                }
            } else {
                if (ss.charAt(1) == '>') {
                    int BeforeNum =
                        Integer.valueOf("" + ss.charAt(ss.length() - 1));
                    int RealNum = s.indexOf("" + ss.charAt(0)) + 1;
                    if (!(RealNum >= BeforeNum)) {
                        return false;
                    }
                } else if (ss.charAt(1) == '<') {
                    int BeforeNum =
                        Integer.valueOf("" + ss.charAt(ss.length() - 1));
                    int RealNum = s.indexOf("" + ss.charAt(0)) + 1;
                    if (!(RealNum <= BeforeNum)) {
                        return false;
                    }
                } else if (ss.charAt(1) == '!') {
                    int BeforeNum =
                        Integer.valueOf("" + ss.charAt(ss.length() - 1));
                    int RealNum = s.indexOf("" + ss.charAt(0)) + 1;
                    if (RealNum == BeforeNum) {
                        return false;
                    }
                }
            }
        }
        return true;
    }
    static void reverse(char num, String[] temp) {
        switch (num) {
            case 'A':
                temp[0] = (change(temp[0]));
                break;
            case 'B':
                temp[1] = (change(temp[1]));
                break;
            case 'C':
                temp[2] = (change(temp[2]));
                break;
            case 'D':
                temp[3] = (change(temp[3]));
                break;
            case 'E':
                temp[4] = (change(temp[4]));
                break;
        }
    }
    static String change(String str) {
        if (str.length() == 3) {
            if (str.charAt(1) == '>') {
                str = str.replace(">", "<=");
            } else if (str.charAt(1) == '=') {
                str = str.replace("=", "!=");
            } else if (str.charAt(1) == '<') {
                str = str.replace("<", ">=");
            }
        } else {
            if (str.charAt(1) == '>') {
                str = str.replace(">=", "<");
            } else if (str.charAt(1) == '!') {
                str = str.replace("!=", "=");
            } else if (str.charAt(1) == '<') {
                str = str.replace("<=", ">");
            }
        }
        return str;
    }
}

ADV-143 扶老奶奶过街

cpp:

#include "stdio.h"
int a[5] = {1, 0, 0, 0, 0};
int check() {
    int A = a[0] + a[4];
    int B = a[2] + a[4];
    int C = a[2] + a[3];
    int D = a[1] + a[2];
    int E = a[4];
    if (!A + B + C + !D + !E == 2) return 1;
    return 0;
}
int main() {
    for (int i = 0; i < 5; i++) {
        if (check()) {
            for (int j = 0; j < 5; j++)
                if (a[j]) printf("%c ", 65 + j);
        }
        int t = a[i];
        a[i] = a[i + 1];
        a[i + 1] = t;
    }

    return 0;
}

java:

public class Main{
    public static void main(String [] args){
        System.out.println("A B E");
    }
}

ADV-144 01背包

cpp:

#include <iostream>
using namespace std;
int w[205];
int v[205];
int wv[205][5005] = {0};
int main() {
    int i, j, n, m;
    cin >> n;
    cin >> m;
    for (i = 1; i <= n; i++) {
        cin >> w[i];
        cin >> v[i];
    }
    for (i = 1; i <= n; i++)
        for (j = 1; j <= m; j++) {
            if (w[i] <= j)
                wv[i][j] = max(wv[i - 1][j], v[i] + wv[i - 1][j - w[i]]);
            else
                wv[i][j] = wv[i - 1][j];
        }
    cout << wv[n][m] << endl;
    return 0;
}

java:

import java.util.Scanner;

public
class Main {
   public
    static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int m = sc.nextInt();
        int[][] d = new int[n + 1][2];
        for (int i = 1; i <= n; i++) {
            d[i][0] = sc.nextInt();
            d[i][1] = sc.nextInt();
        }
        int[][] dp = new int[n + 1][m + 1];
        for (int i = 1; i < n + 1; i++) {
            for (int j = 1; j < m + 1; j++) {
                if (j >= d[i][0]) {
                    dp[i][j] = Math.max(dp[i - 1][j],
                                        dp[i - 1][j - d[i][0]] + d[i][1]);
                } else {
                    dp[i][j] = dp[i - 1][j];
                }
            }
        }
        System.out.println(dp[n][m]);
    }
}

ADV-147 学霸的迷宫

cpp:

#include <ctype.h>
#include <math.h>
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <iostream>
#include <map>
#include <queue>
#include <stack>
#define Max 510
#define inf 100000000
using namespace std;
int vis[Max][Max], r, l;
int Mov[4][2] = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}};
char str[5] = "UDLR", m[Max][Max], step[Max];
struct Node {
    int x;
    int y;
    int s;
    char sp;
} path[Max][Max];
int BFS() {
    Node now;
    memset(vis, 0, sizeof(vis));
    now.x = now.y = 0;
    path[now.x][now.y].s = 0;
    path[now.x][now.y].sp = 0;
    queue<Node> q;
    q.push(now);
    while (q.size() > 0) {
        now = q.front();
        if (now.x == r - 1 && now.y == l - 1) {
            break;
        }
        q.pop();
        Node next = now;
        // printf("now:x %d y %d  step %d  straight
        // %c\n",now.x,now.y,path[now.x][now.y].s,path[now.x][now.y].sp);
        for (int i = 0; i < 4; i++) {
            next.x = now.x + Mov[i][0];
            next.y = now.y + Mov[i][1];
            if (!vis[next.x][next.y] &&
                (next.x >= 0 && next.x < r && next.y >= 0 && next.y < l) &&
                m[next.x][next.y] != '1') {
                vis[next.x][next.y] = 1;
                path[next.x][next.y] = now;
                path[next.x][next.y].sp = str[i];
                path[next.x][next.y].s = path[now.x][now.y].s + 1;
                q.push(next);
                // printf("next:x %d y %d  step %d  straight
                // %c\n",next.x,next.y,path[next.x][next.y].s,path[next.x][next.y].sp);
            }
        }
    }
    // printf("%d\n",path[r-1][l-1].s);
    return path[r - 1][l - 1].s;
}
int main() {
    while (scanf("%d%d", &r, &l) != EOF) {
        for (int i = 0; i < r; i++) {
            scanf("%s", m[i]);
        }
        printf("%d\n", BFS());
        int len = 0;
        int nx = r - 1, ny = l - 1;
        int nextx = nx, nexty = ny;
        while (1) {
            nx = nextx;
            ny = nexty;
            if (nx + ny == 0) {
                break;
            }
            step[len++] = path[nx][ny].sp;
            nextx = path[nx][ny].x;
            nexty = path[nx][ny].y;
        }
        for (int i = len - 1; i >= 0; i--) {
            printf("%c", step[i]);
        }
        printf("\n");
    }
    return 0;
}

java:


import java.util.*;
public class Main
{
    private static int[][] move= {{1,0},{0,-1},{0,1},{-1,0}};//下 左 右 上  不按这个顺序设置会出错
    private static String[] pos= {"D","L","R","U"};//方向数组
    private static char[][] map;//保存地图
    private static int[][] book;//标记是否走过
    private static int n;//地图行
    private static int m;//地图列
    public static void main(String[] args)
    {
        Scanner scan=new Scanner(System.in);
        n=0;
        m=0;
        n=scan.nextInt();
        m=scan.nextInt();
        map=new char[n][m];
        book=new int[n][m];
        for(int i=0;i<n;i++)//输入地图
        {
            String s=scan.next();
            map[i]=s.toCharArray();
        }
        bfs(0,0,"");//广搜
        scan.close();
    }
    private static void bfs(int x, int y, String step)//坐标点及上一步的走向
    {
        Queue<Node> queue=new LinkedList<Node>();
        queue.offer(new Node(x,y,step));//起始点入队
        book[x][y]=1;//标记为走过
        while(!queue.isEmpty())
        {
            Node node=queue.poll();//取队头
            int x1=node.x;//获取当前点的坐标及来自上一步的走向,比如说上一步走D(向下走一步),才走到当前点的
            int y1=node.y;
            String step1=node.step;
            if(x1==n-1&&y1==m-1)//走到目标位置
            {
                System.out.println(step1.length());
                System.out.println(step1);
            }
            for(int i=0;i<4;i++)//循环四个方向
            {
                int mx=x1+move[i][0];
                int my=y1+move[i][1];
                //没走出界,没走过,且能走
                if(mx>=0&&mx<n&&my>=0&&my<m&&book[mx][my]==0&&map[mx][my]=='0')
                {
                    book[mx][my]=1;
                    String s=step1+pos[i];//作为下一个点的来自前面所有点的走向
                    queue.offer(new Node(mx,my,s));
                }
            }
        }
    }
}
class Node
{
    int x;
    int y;
    String step;
    public Node(int x,int y,String step)//坐标点及来自上一步的走向
    {
        this.x=x;
        this.y=y;
        this.step=step;
    }
}

ADV-150 周期字串

cpp:

#include <string.h>
#include <iostream>
using namespace std;
int count;
char a[100];
void f(int n, int k) {
    int i, j, zhouqi, c, fla = 0;
    for (i = 1; i <= n; i++) {
        if (n % i == 0) {
            for (j = 0; j < n / i; j++) {
                for (c = 0; c < i; c++) {
                    if (a[c] != a[j * i + c]) {
                        fla = 1;
                        break;
                    }
                }
                if (fla) break;
            }
            if (fla == 0) {
                count = i;
                return;
            }
        }
        fla = 0;
    }
}
int main() {
    int n;
    cin >> a;
    f(strlen(a), 1);
    cout << count << endl;
    return 0;
}

java:


import java.util.*;

public class Main {
	public static void main(String[] args) {
		Scanner s = new Scanner(System.in);
		String input = s.next();
		char one = input.charAt(0);
		int index=1;
		int flag=0;
		int count=0;
		
		while(flag==0) {
			int i=index;
			for(;i<input.length();i++) {
				if(input.charAt(i)==one) {			
					if(i+input.substring(0,i).length()>input.length()) {
						flag=0;
						break;
					}
					else if(input.substring(0,i).equals(input.substring(i,i+input.substring(0,i).length()))) {
						index=i;
						break;
					}
				}			
			} 				//找到第一组相同的 
			if(i==input.length())
				break;
			//考虑只有前两组
			if(i+index==input.length()) {
				flag=1;break;
			}
			else if(input.length()>i+index&&input.length()<i+index+index)//考虑有前两组再多一点
			{
				flag=0;
				break;
			}
			
			for(i=index;i+index+index<=input.length();i+=index) {
				if(!input.substring(i,i+index).equals(input.substring(i+index, i+index+index))) {
					index++;
					break;
				}  //比较第二组与第三组
				else if(input.substring(i,i+index).equals(input.substring(i+index, i+index+index))&&i+index+index==input.length())
					flag=1;	
				else if(i+index+index>input.length()||i+index<input.length()) {
					flag=0;count=1;
				}
					
			}	
			if(count==1)
				break;
	
		}
		if(flag==0)
			System.out.print(input.length());
		else
			System.out.print(index);
	
	}
}

ADV-151 金陵十三钗

cpp:

#include <algorithm>
#include <cstdio>
#include <cstring>
#include <iostream>
#define MAXN 15
using namespace std;
const int maxzt = (1 << 13);  //最大的状态数,
int dp[maxzt];
int like[MAXN][MAXN], n;
int numberOfOne(int num) {  // num 二进制中1的个数
    int cnt = 0;
    while (num) {
        cnt += (num & 1);
        num >>= 1;
    }
    return cnt;
}
int lowbit(int x) {  // num 二进制中只保留最后一个1 如: num=20 二进制10100 返回
                     // 二进制100,也就是4
    return x & (-x);
}
int posOfOne(
    int num) {  // num 二进制中最后一个1的位置  如: num=18 二进制10010 返回 2
    int pos = 0;
    while (num) {
        pos++;
        if (num & 1) return pos;
        num >>= 1;
    }
    return pos;
}
void work(int x) {
    int maxstatus = 1 << n;
    for (int i = 0; i < maxstatus; i++) {
        int nowstatus = i, t = numberOfOne(nowstatus);
        if (t != x) continue;  //第x位女人有x个1,不是就继续找下一个数
        while (t--) {
            int pos = lowbit(nowstatus);
            dp[i] = max(dp[i], dp[i - pos] + like[x][posOfOne(pos)]);
            nowstatus -= pos;
        }
    }
}
int main() {
    scanf("%d", &n);
    for (int i = 1; i <= n; i++)
        for (int j = 1; j <= n; j++) scanf("%d", &like[i][j]);
    memset(dp, 0, sizeof(dp));
    for (int i = 1; i <= n; i++) work(i);
    printf("%d\n", dp[(1 << n) - 1]);
    return 0;
}

java:

import java.util.Scanner;

public
class Main {
   private
    static int n;
   private
    static int maxzt = (1 << 13);
    static int[] dp = new int[maxzt];
   private
    static int[][] like = new int[15][15];

   public
    static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        n = sc.nextInt();
        for (int i = 1; i <= n; i++) {
            for (int j = 1; j <= n; j++) {
                like[i][j] = sc.nextInt();
            }
        }
        for (int i = 1; i <= n; i++) {
            work(i);
        }
        System.out.println(dp[(1 << n) - 1]);
    }

   private
    static void work(int x) {
        int maxstatus = 1 << n;
        for (int i = 0; i < maxstatus; i++) {
            int nowstatus = i;
            int t = numberOfOne(nowstatus);
            if (t != x) {
                continue;
            }
            while (t != 0) {
                t--;
                int pos = lowbit(nowstatus);
                dp[i] = Math.max(dp[i], dp[i - pos] + like[x][posOfOne(pos)]);
                nowstatus -= pos;
            }
        }
    }

   private
    static int posOfOne(int num) {
        int pos = 0;
        while (num != 0) {
            pos++;
            if ((num & 1) == 1) {
                return pos;
            }
            num >>= 1;
        }
        return pos;
    }

   private
    static int lowbit(int x) { return x & (-x); }

   private
    static int numberOfOne(int num) {
        int cnt = 0;
        while (num != 0) {
            cnt += (1 & num);
            num >>= 1;
        }
        return cnt;
    }
}

ADV-155 上帝造题五分钟

cpp:

#include <stdio.h>
#include <stdlib.h>
int min(int a, int b, int c[]) {
    int i;
    int mina = c[a];
    for (i = a + 1; i <= b; i++) {
        if (c[i] < mina) {
            mina = c[i];
        }
    }
    return mina;
}
int main() {
    int i, n, q, b, c, a[2000];
    scanf("%d%d", &n, &q);
    for (i = 0; i < n; i++) {
        scanf("%d", &a[i]);
    }
    for (i = 0; i < q; i++) {
        scanf("%d%d", &b, &c);
        printf("%d\n", min(b, c, a));
    }
    system("pause");
    return 0;
}

java:

import java.util.*;

public class Main {

	public static void main(String[] args) {
		Scanner in = new Scanner(System.in);
		int n = in.nextInt();
		int q = in.nextInt();
		int a[] = new int[n], i, b[] = new int[q];
		for (i = 0; i < n; i++)
			a[i] = in.nextInt();
		for (i = 0; i < q; i++)
			b[i] = min(in.nextInt(), in.nextInt(), a);
		for (i = 0; i < q; i++)
			System.out.println(b[i]);
		in.close();
	}

	public static int min(int i, int n, int a[]) {
		int min = 1010;
		for (; i <= n; i++)
			if (a[i] < min)
				min = a[i];
		return min;
	}
}

ADV-158 新建Microsoft Word文档

cpp:

#include <cmath>
#include <iostream>
#include <string>
using namespace std;
#define SIZE 1481
int main() {
    int arr[SIZE] = {0};
    int table[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
    int n;
    cin >> n;
    cin.clear();
    cin.get();
    int length;
    int temp;
    string str;
    string cmd[SIZE];
    for (int i = 0; i < n; i++) {
        getline(cin, cmd[i]);
    }
    for (int i = 0; i < n; i++) {
        str = cmd[i];
        if (str == "New") {
            for (int j = 0; j < SIZE; j++) {
                if (arr[j] == 0) {
                    arr[j] = j + 1;
                    cout << j + 1 << endl;
                    break;
                }
            }
        } else {
            length = str.length();
            temp = 0;
            for (int i = 7; i < length; i++) {
                temp = temp + table[str[i] - 48] * pow(10, length - 1 - i);
            }
            if (arr[temp - 1] == 0) {
                cout << "Failed" << endl;
                continue;
            } else {
                arr[temp - 1] = 0;
                cout << "Successful" << endl;
                continue;
            }
        }
    }
    return 0;
}

java:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main  {
	public static void main(String[] args) throws NumberFormatException, IOException {
		BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
		int n = Integer.parseInt(bf.readLine());
		String ne = "New";
		String de = "Delete";
		int arr[] = new int[n+1];
		int num = 0;
		int step =n;
		while(n>0) {
			String temp = bf.readLine();
			if(temp.split(" ")[0].equals(ne)) {
				for(int i=1;i<=step;i++){
					if(arr[i]==0) {
						num = i;
						arr[i] = 1;
						System.out.println(num);
						break;
					}
				}
			}
			else if(temp.split(" ")[0].equals(de)){
				int number = Integer.parseInt(temp.split(" ")[1]);
				if(arr[number] ==0)
					System.out.println("Failed");
				else if(arr[number] == 1)
					System.out.println("Successful");
				arr[number] =0;
			}
				
			n--;
		}
	}
}

ADV-162 题目1 最大最小值

cpp:

#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
int main() {
    long int a[10001];
    int n;
    scanf("%d", &n);
    for (int i = 0; i < n; i++) scanf("%ld", &a[i]);
    sort(a, a + n);
    printf("%d %d", a[n - 1], a[0]);
    return 0;
}

java:

import java.io.*;

public class Main 
{	
	//BufferedReader
	public static void main(String[] args) throws NumberFormatException, IOException 
	{
		BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
		int N=Integer.parseInt(br.readLine());
		String[] nums=br.readLine().split(" ");
		int minValue=Integer.MAX_VALUE;
		int maxValue=Integer.MIN_VALUE;
		for(int i=0; i<N; i++)
		{
			int a=Integer.parseInt(nums[i]);
			minValue=Math.min(minValue, a);
			maxValue=Math.max(maxValue, a);
		}
		System.out.println(maxValue+" "+minValue);
	}
}

ADV-164 金明的预算方案

cpp:

#include <stdio.h>
int v[70];
int p[70];
int q[70];
int f[50000];
int max(int a, int b) { return a > b ? a : b; }
int main() {
    int n, m;
    int i, j, k;
    int t1, t2;
    int k1, k2;
    int l = 0;
    scanf("%d%d", &n, &m);
    for (i = 1; i <= m; i++) {
        scanf("%d%d%d", &v[i], &p[i], &q[i]);
    }
    for (i = 1; i <= m; i++) {
        k1 = 0;
        k2 = 0;
        t1 = 0;
        t2 = 0;
        if (q[i] == 0)  //要是主物件
        {
            for (k = i + 1; k <= m; k++)
                if (q[k] == i)  //找到附属物品1
                {
                    t1 = k;
                    k1 = 1;
                    break;
                }
            for (k = t1 + 1; k <= m; k++)
                if (q[k] == i)  //找到附属物品2
                {
                    t2 = k;
                    k2 = 1;
                    break;
                }
            for (j = n; j >= v[i]; j--) {
                f[j] = max(f[j - v[i]] + v[i] * p[i], f[j]);

                f[j] =
                    max(f[j - v[i]] + v[i] * p[i], f[j]);  //只要主件或者都不要
                if ((j - v[i] - v[t1]) >= 0 && k1 == 1)  //要附件1

                    f[j] =
                        max(f[j - v[i] - v[t1]] + v[i] * p[i] + v[t1] * p[t1],
                            f[j]);
                if ((j - v[i] - v[t2]) >= 0 && k2 == 1)

                    f[j] =
                        max(f[j - v[i] - v[t2]] + v[i] * p[i] + v[t2] * p[t2],
                            f[j]);
                if ((j - v[i] - v[t1] - v[t2]) >= 0 && k1 == 1 && k2 == 1)
                    f[j] = max(f[j - v[i] - v[t1] - v[t2]] + v[i] * p[i] +
                                   v[t1] * p[t1] + v[t2] * p[t2],
                               f[j]);
            }
        }
    }
    printf("%d\n", f[n]);

    return 0;
}

java:


import java.io.BufferedReader;
import java.io.InputStreamReader;

// 金明的预算方案
public class Main {

	public static void main(String[] args) throws Exception{
		int[][] dp = new int[61][32001];
		int[][] prices = new int[61][3];
		int[][] values = new int[61][3];
		
		
		BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
		String[] s = bf.readLine().split(" ");
		int TotalMoney = Integer.parseInt(s[0]);
		int M = Integer.parseInt(s[1]);

		for (int i = 1; i <= M; i++) {
			s = bf.readLine().split(" "); // 钱数 重要度 主副件
			if (Integer.parseInt(s[2]) == 0) { // 主键
				prices[i][0] = Integer.parseInt(s[0]);
				values[i][0] = Integer.parseInt(s[1]);
			}else {
				// 第一副件
				if (prices[Integer.parseInt(s[2])][1] == 0) {
					prices[Integer.parseInt(s[2])][1] = Integer.parseInt(s[0]);
					values[Integer.parseInt(s[2])][1] = Integer.parseInt(s[1]);
				}else {
					prices[Integer.parseInt(s[2])][2] = Integer.parseInt(s[0]);
					values[Integer.parseInt(s[2])][2] = Integer.parseInt(s[1]);
				}
			}
		}
		
		for (int i = 1; i <= M; i++) {
			for (int j = 0; j <= TotalMoney; j++) {
				if (j >= prices[i][0]) {
					// 仅主件 和 全不选
					dp[i][j] = Math.max(dp[i-1][j], values[i][0]*prices[i][0] + dp[i-1][j-prices[i][0]]);
					// 主 + 副1
					if (j >= prices[i][0]+prices[i][1]) {
						dp[i][j] = Math.max(dp[i][j], dp[i-1][j-prices[i][0]-prices[i][1]] + values[i][0]*prices[i][0] + values[i][1]*prices[i][1]);
					}
					// 主 + 副2
					if (j >= prices[i][0]+prices[i][2]) {
						dp[i][j] = Math.max(dp[i][j], dp[i-1][j-prices[i][0]-prices[i][2]] + values[i][0]*prices[i][0] + values[i][2]*prices[i][2]);
					}
					// 主 + 副1 + 副 2
					if (j >= prices[i][0]+prices[i][1]+prices[i][2]) {
						dp[i][j] = Math.max(dp[i][j], dp[i-1][j-prices[i][0]-prices[i][1]-prices[i][2]] + values[i][0]*prices[i][0]+ values[i][1]*prices[i][1] + values[i][2]*prices[i][2]);
					}
				}else {
					dp[i][j] = dp[i-1][j];
				}
			}
		}
		System.out.println(dp[M][TotalMoney]);
	}
}

ADV-167 快乐司机

cpp:

#include <stdio.h>
#include <algorithm>
using namespace std;

struct stt {
    int g, p;
    double v;

    bool operator<(const stt& t) const { return v > t.v; }

} a[10005];
int main() {
    int n, w;
    scanf("%d%d", &n, &w);
    for (int i = 0; i < n; i++) {
        scanf("%d%d", &a[i].g, &a[i].p);
        a[i].v = 1.0 * a[i].p / a[i].g;
    }
    sort(a, a + n);
    double sum = 0.0;
    for (int i = 0; i < n; i++) {
        if (w > 0) {
            if (w > a[i].g)
                w -= a[i].g, sum += a[i].p;
            else
                sum += w * a[i].v, w = 0;

        } else
            break;
    }
    printf("%.1lf\n", sum);

    return 0;
}

java:

import java.util.Scanner;

public class Main {
    
    static class good {
        public int weight;  //重量
        public double value;  //单价
        
        good(int weight, double value) {
            this.weight = weight;
            this.value = value;
        }
    }
    //使用合并排序,按照物品的单价value,对A进行从大到小排序
    public void mergeSort(good[] A) {
        if(A.length > 1) {
            good[] leftA = getHalfArray(A, 0);   //获取A的左半部分对象
            good[] rightA = getHalfArray(A, 1);  //获取A的右半部分对象
            mergeSort(leftA);
            mergeSort(rightA);
            getMerge(A, leftA, rightA);
        }
    }
    //根据judge判断,获取A的一半对象
    public good[] getHalfArray(good[] A, int judge) {
        good[] half;
        int len = A.length;
        if(judge == 0) {
            half = new good[len / 2];
            for(int i = 0;i < len / 2;i++)
                half[i] = A[i];
        } else {
            half = new good[len - len / 2];
            for(int i = 0;i < len - len / 2;i++)
                half[i] = A[len / 2 + i];
        }
        return half;
    }
    //对A进行合并,获取从大到小排序
    public void getMerge(good[] A, good[] leftA, good[] rightA) {
        int i = 0, j = 0, count = 0;
        int lenLeftA = leftA.length, lenRightA = rightA.length;
        while(i < lenLeftA && j < lenRightA) {
            if(leftA[i].value >= rightA[j].value)
                A[count++] = leftA[i++];
            else
                A[count++] = rightA[j++];
        }
        while(i < lenLeftA)
            A[count++] = leftA[i++];
        while(j < lenRightA)
            A[count++] = rightA[j++];
    }
    
    public void printResult(int w, good[] A) {
        mergeSort(A);
        int sumW = 0, i = 0;
        double result = 0;
        for(;i < A.length;i++) {
            if(sumW + A[i].weight <= w) {
                sumW += A[i].weight;
                result += A[i].weight * A[i].value;
            }
            else
                break;
        }
        if(i < A.length)   //此处要特别注意,唯有还有物品剩余,才可以进行下面语句执行
            result += (w - sumW) * A[i].value;
        System.out.printf("%.1f", result);
        return;
    }

    public static void main(String[] args) {
        Main test = new Main();
        Scanner in = new Scanner(System.in);
        int n = in.nextInt();
        int w = in.nextInt();
        if(n <= 0 || w == 0) {
            System.out.println("0.0");
            return;
        }
        good[] A = new good[n];
        for(int i = 0;i < n;i++) {
            int g = in.nextInt();
            int p = in.nextInt();
            double v = p * 1.0 / g;
            A[i] = new good(g, v);
        }
        test.printResult(w, A);
        
    }
}

ADV-171 身份证号码升级

cpp:

#include <stdio.h>
#include <stdlib.h>
int main() {
    int i, j, sum = 0;
    int base[] = {7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2};
    char end[] = {'1', '0', 'x', '9', '8', '7', '6', '5', '4', '3', '2'};
    char id[19];
    gets(id);
    for (i = 14; i >= 6; i--) {
        id[i + 2] = id[i];
    }
    id[6] = '1';
    id[7] = '9';
    for (i = 0; i < 17; i++) {
        sum += base[i] * (id[i] - '0');
    }
    id[17] = end[sum % 11];
    id[18] = '\0';
    puts(id);
    system("pause");
    return 0;
}

java:

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;

public class Main {
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		PrintWriter out = new PrintWriter(new BufferedWriter(
				new OutputStreamWriter(System.out)));
		int[] arr = new int[] { 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8,
				4, 2 };
		char[] num = new char[] { '1', '0', 'x', '9', '8', '7', '6', '5', '4',
				'3', '2' };
		StringBuffer sb = new StringBuffer();
		String str;
		int sum;
		while ((str = br.readLine()) != null) {
			sb.append(str);
			sb.insert(6, "19");
			sum = 0;
			for (int i = 0; i < sb.length(); i++) {
				sum += (sb.charAt(i) - 48) * arr[i];
			}
			sb.append(num[sum % 11]);
			System.out.println(sb.toString());
		}
	}

}

ADV-175 三个整数的排序

cpp:

#include <cstdio>
#include <iostream>
using namespace std;
int main() {
    int a[3];
    scanf("%d%d%d", &a[0], &a[1], &a[2]);
    for (int i = 0; i < 2; i++) {
        for (int j = i + 1; j < 3; j++) {
            if (a[i] < a[j]) {
                swap(a[i], a[j]);
            }
        }
    }

    for (int i = 0; i < 3; i++) {
        printf("%d ", a[i]);
    }

    return 0;
}

java:

import java.util.Arrays;
import java.util.Scanner;
public class Main {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int[] a = new int[3];
		for (int i = 0; i < a.length; i++) {
			a[i] = sc.nextInt();
		}
		Arrays.sort(a);
		for (int i = a.length - 1; i >= 0; i--) {
			System.out.print(a[i] + " ");
		}
	}
}

ADV-178 简单加法

cpp:

#include <iostream>
using namespace std;
int main() {
    int sum = 0;
    for (int i = 1; i < 1000; i++) {
        if (i % 3 == 0 || i % 5 == 0) {
            sum += i;
        }
    }
    cout << sum;
    return 0;
}

java:

public class Main{
    public static void main(String [] args){
        int sum=0;
        for (int i=1;i<1000;i++){
            if (i%3==0||i%5==0){
                sum+=i;
            }
        }
        System.out.println(sum);
    }
}

ADV-188 排列数

cpp:

#include <algorithm>
#include <iostream>
#include <vector>
using namespace std;
vector<int> jc(10), num(10);
int main() {
    jc[0] = 0;
    num[0] = 0;
    jc[1] = 1;
    num[1] = 1;
    for (int i = 2; i <= 9; i++) {
        num[i] = i;
        jc[i] = i * jc[i - 1];
    }
    int n;
    cin >> n;
    n--;
    for (int i = 9; i >= 1; i--) {
        int temp = n / jc[i];
        cout << num[temp];
        num.erase(num.begin() + temp);
        n = n % jc[i];
    }
    cout << num[0];
    return 0;
}

java:

import java.util.Scanner;

public class Main {
	static int t[]=new int [10];
	static String str="";
	static long n;
	public static void main(String[] args) {
		Scanner scanner=new Scanner(System.in);
		n=scanner.nextLong();
		scanner.close();
		n--;
		for (int i = 0; i < 10; i++) {
			cz(i);
		}
		System.out.println(str);
		
	}
	static void cz(int wz) {
		int tt= (int)(n/js(9-wz));
		n-=js(9-wz)*tt;
		for (int i = 0; i < 10; i++) {
			if (t[i]==0) {
				tt--;
				if (tt==-1) {
					t[i]=99;
					str+=i;
					return;
				}
			}
		}
	}
	static long js(int ws){
		long s=1;
		for (int i = 2; i <= ws; i++) {
			s*=i;
		}
		return s;
	}
}

ADV-193 盾神与条状项链

cpp:

#include <stdio.h>
typedef struct Color {
    int pre;
    int next;
} color;
color c[100001];
int m, n;
int main() {
    int i, j, cr, p0 = 0, n0, P, Q;
    char s[4];
    scanf("%d%d", &n, &m);
    for (i = 0; i < n; i++) {
        scanf("%d", &cr);
        n0 = cr;
        c[p0].next = n0;
        c[n0].pre = p0;
        p0 = n0;
    }
    c[p0].next = -1;
    while (m) {
        scanf("%s", s);
        if (s[0] == 'A') {
            scanf("%d%d", &P, &Q);
            p0 = c[P].pre;
            c[p0].next = Q;
            c[Q].pre = p0;
            c[Q].next = P;
            c[P].pre = Q;
            n++;
        }
        if (s[0] == 'D') {
            scanf("%d", &P);
            p0 = c[P].pre;
            n0 = c[P].next;
            c[p0].next = n0;
            c[n0].pre = p0;
            n--;
        }
        m--;
    }
    printf("%d\n", n);
    i = 0;
    while (c[i].next != -1) {
        printf("%d ", c[i].next);
        i = c[i].next;
    }
    return 0;
}

java:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.StreamTokenizer;
import java.util.ArrayList;
import java.util.Scanner;


public class Main {

	public static void main(String[] args) throws IOException {
			StreamTokenizer in = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
			PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));
			ArrayList<Integer> list = new ArrayList<Integer>();
			in.nextToken();
			int n = (int) in.nval;
			in.nextToken();
			int m = (int) in.nval;
			for(int i = 0;i<n;i++)
				{
				in.nextToken();
				list.add((int)in.nval);
				}
			for(int i = 0;i<m;i++)
			{
				in.nextToken();
				String st = in.sval;
				in.nextToken();
				int num =(int) in.nval;
				if(st.equals("DEL"))
				{	
					int p = list.indexOf(num);
					list.remove(p);
				}
				else if(st.equals("ADD"))
				{
					in.nextToken();
					int num2 = (int) in.nval;
					int w = list.indexOf(num);
					list.add(w, num2);
				}
			}
			out.println(list.size());
			for(int i = 0;i<list.size()-1;i++)
				out.print(list.get(i)+" ");
			out.println(list.get(list.size()-1));
			
			out.flush();
	}		

}

ADV-197 P1001

cpp:

#include<bits/stdc++.h>
using namespace std;

int main(){
    long long int a,b;
    scanf("%lld%lld",&a,&b);
    printf("%lld\n",a*b);
    return 0;
}

java:

import java.util.Scanner;
public class Main{
	public static void main(String[] args){
		Scanner sc = new Scanner(System.in);
		String a = sc.next();
        String b = sc.next();
        int c=Integer.parseInt(a);
        int d=Integer.parseInt(b);
        String s=Long.toString((long)c*(long)d);
        System.out.print(s);

	}

}

ADV-200 求最大值

cpp:

#include <algorithm>
#include <cstdio>
#include <cstring>
class Node {
   public:
    int as, bs, sum;
    Node() { as = bs = sum = 0; }
};

Node arr[110];
Node dp[110];
Node total;
Node ret;
bool vis[110];

bool cmp(Node a, Node b) { return a.sum > b.sum; }

int Solve(int n) {
    memset(vis, true, sizeof(vis));
    std::sort(arr, arr + n, cmp);

    ret = arr[0];
    bool update = true;
    while (update) {
        update = false;
        for (int i = 1; i < n; ++i)
            if (ret.as + arr[i].as >= 0 && ret.bs + arr[i].bs >= 0 &&
                arr[i].sum >= 0 && vis[i]) {
                vis[i] = false, update = true, ret.as += arr[i].as,
                ret.bs += arr[i].bs, ret.sum += arr[i].sum;
            }
    }
    return ret.as >= 0 && ret.bs >= 0 ? ret.sum : 0;
}

int main() {
    int n;
    scanf("%d", &n);
    int len = 0;
    for (int i = 0; i < n; ++i) {
        scanf("%d%d", &arr[len].as, &arr[len].bs),
            arr[len].sum = arr[len].as + arr[len].bs;
        if (arr[len].as > 0 || arr[len].bs > 0) {
            total.as += arr[len].as, total.bs += arr[len].bs,
                total.sum += arr[len].sum;
            ++len;
        }
    }
    int ans = Solve(len);
    if (total.as >= 0 && total.bs >= 0)
        printf("%d\n", std::max(ans, total.sum));
    else
        printf("%d\n", ans);
    return 0;
}

java:

import java.util.*;
public class Main{
	public static void main(String[] args) {
		int max=0,aa=0, bb=0;
		boolean k=true;
		Scanner in=new Scanner(System.in);
		int n=in.nextInt();
		int[] ai=new int[n];
		int[] bi=new int[n];
		for(int i=0;i<n;i++){
			ai[i]=in.nextInt();
			bi[i]=in.nextInt();
		}
		for(int i=0;i<n-1;i++){
			for(int j=0;j<n-1;j++){
				if((ai[j]+bi[j])<(ai[j+1]+bi[j+1])){
					aa=ai[j];
					ai[j]=ai[j+1];
					ai[j+1]=aa;
					bb=bi[j];
					bi[j]=bi[j+1];
					bi[j+1]=bb;
				}
			}
		}
		for(int i=0;i<n-1;i++){
			for(int j=0;j<n-1;j++){
				if(k==true){
					if((ai[i]+bi[i])>=0||(ai[j+1]+bi[j+1])>=0){
						if((ai[i]+ai[j+1]>=0) && (bi[i]+bi[j+1]>=0)){
							aa=ai[i]+ai[j+1];
							bb=bi[i]+bi[j+1];
							max=aa+bb;
							ai[i]=0;
							ai[j+1]=0;
							bi[i]=0;
							bi[j+1]=0;
							k=false;
						}
					}
				}
				else if((ai[j+1]+bi[j+1])>=0 ){
					if( (ai[j+1]+aa>=0) && bi[j+1]+bb>=0){
						aa+=ai[j+1];
						bb+=bi[j+1];
						max+=ai[j+1]+bi[j+1];
						ai[j+1]=0;
						bi[j+1]=0;
					}
				}	
			}
		}
		System.out.print(max);
	}

}
发布了234 篇原创文章 · 获赞 159 · 访问量 9万+

猜你喜欢

转载自blog.csdn.net/qq_36306833/article/details/104718366