文章目录
- ADV-103 逆序排列
- ADV-112 c++_ch02_01
- ADV-120 6-17复数四则运算
- ADV-123 概率计算
- ADV-127 日期计算
- ADV-141 判断名次
- ADV-143 扶老奶奶过街
- ADV-144 01背包
- ADV-147 学霸的迷宫
- ADV-150 周期字串
- ADV-151 金陵十三钗
- ADV-155 上帝造题五分钟
- ADV-158 新建Microsoft Word文档
- ADV-162 题目1 最大最小值
- ADV-164 金明的预算方案
- ADV-167 快乐司机
- ADV-171 身份证号码升级
- ADV-175 三个整数的排序
- ADV-178 简单加法
- ADV-188 排列数
- ADV-193 盾神与条状项链
- ADV-197 P1001
- ADV-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);
}
}