1.排列数
2.生物芯片
3.稍大的串
4.大臣的旅费
5.Excel地址转换
6.买不到的数
7.趣味算式
8.日程表
深搜代码:
import java.util.HashMap;
import java.util.Iterator;
import java.util.Random;
import java.util.Scanner;
public class Main {
static int arr[] = {0,1,2,3,4,5,6,7,8,9};
static int visited[] = {0,0,0,0,0,0,0,0,0,0};
static int n,k = 0;
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
n = in.nextInt();
dfs(0);
}
public static void dfs(int offset) {
if(offset == 10 ) {
k++;
if(k == n) {
for(int i = 0; i <= 9; i++) {
System.out.print(arr[i]);
}
System.out.println();
return ;
}
}
for(int i = 0; i < 10; i++) {
if(visited[i] == 0) {
visited[i] = 1;
arr[offset] = i;
dfs(offset+1);
visited[i] = 0;
}
}
}
}
也可以用c++的全排函数:
#include
#include
using namespace std;
int main() {
string s = "0123456789";
int n;
cin >> n;
int cnt = 1;
do {
if(cnt == n) {
cout << s;
break;
}
cnt++;
}while(next_permutation(s.begin(), s.end()));
return 0;
}
但我试着用自己学到的全排函数的模板来写,却不通过,应该顺序不一样。
import java.util.HashMap;
import java.util.Iterator;
import java.util.Random;
import java.util.Scanner;
public class Main {
static int arr[] = {0,1,2,3,4,5,6,7,8,9};
static int n,k = 0;
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
n = in.nextInt();
dp(0);
}
public static void dp(int offset) {
if(offset == 10 - 1) {
k++;
if(k == n) {
for(int i = 0; i <= 9; i++) {
System.out.print(arr[i]);
}
System.out.println();
return ;
}
}
for(int i = offset; i < 10; i++) {
swap(i, offset);
dp(offset + 1);
swap(i, offset);
}
}
public static void swap(int a, int b) {
int temp = arr[a];
arr[a] = arr[b];
arr[b] = temp;
}
}
思路:仔细想一想就会发现在l-r的区间中,只有完全平方数的因子是奇数个,因为因数都是成对出现的,所以完全平方数的光源是暗的(加上自己本身因子为偶数个)。
编号:1 2 3 4 5 6 7 8 9
倍数:2 3 4 5 6 7 8 9
个数:0 1 1 2 1 3 1 3 2
所以代码如下:
#include"iostream"
#include"math.h"
using namespace std;
typedef long long ll;
int main()
{
ll n,l,r;
cin>>n>>l>>r;
ll beg=sqrt(l);
ll end=sqrt(r);
ll num=end-beg;
if(beg*beg==l) num++;
cout<
import java.util.*;
public class Pai
{
static boolean f_next(char[] a){
int x1 = -1;
for(int i=a.length-1; i>0; i--){
if(a[i-1]0; i--){
if(a[i]>a[x1]){
y = i;
break;
}
}
{char t = a[x1]; a[x1] = a[y]; a[y] = t;}
y = a.length-1;
while(true){
if(x2>=y) break;
char t = a[x2];
a[x2] = a[y];
a[y] = t;
x2++;
y--;
}
return true;
}
public static void main(String[] args)
{
Scanner scan = new Scanner(System.in);
char[] a = scan.nextLine().trim().toCharArray();
f_next(a);
for(int i=0; i
CPU消耗 < 5000ms
思路:
这题给的时间有五秒那么多。
本题给出的一个图满足要求“使得任何一个大城市都能从首都直接或者通过其他大城市间接到达,同时,如果不重复经过大城市,从首都到达每个大城市的方案都是唯一的”,这说明给出的道路是一棵树。
最后的答案需要使用double或者long long类型计算。
import java.util.Arrays;
import java.util.Scanner;
public class Main {//单纯的用二维数组会超时,为什么用动态数组就不会内存了呢
public static int[][] Map = new int[7010][7010];
public static int[] vis = new int[7010];
public static int ans = -99999,temp,n;
static void dfs(int s,int dist){//深度优先搜索
//总的花费
if(dist > ans ){ //保存最长路以及最长路端点
ans = dist;
temp = s;//这里非常的关键,要进行最远路的点的更换
}
for(int i=1;i<=n;i++){
if(vis[i]==0 && Map[s][i]>0){
//如果没有被访问过 而且 s与i间的路程有效
vis[i] = 1;//被置为访问过
dist += Map[s][i];//累加路程
dfs(i,dist);//i 变 s 再进行下一
vis[i] = 0;
dist -= Map[s][i];
}
}
return;
}
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
n = sc.nextInt();
for(int i=0;i
c++版:
#include
#include
#include
#include
using namespace std;
const int MAXN = 100010;
class Edge {
public:
int to;
int len;
Edge *next;
};
int n;
Edge* first[MAXN];
Edge edges[MAXN * 2];
int mlen;
bool reached[MAXN];
int q[MAXN];
int len[MAXN];
int getF(int x)
{
memset(reached, 0, sizeof(reached));
int open = 0, close = 0;
len[x] = 0;
reached[q[open++]=x] = true;
mlen = 0;
int ret = x;
while (close < open)
{
int p = q[close++];
for (Edge *e = first[p]; e; e = e->next)
{
if (!reached[e->to])
{
int t = len[e->to] = len[p] + e->len;
if (t > mlen)
{
mlen = t;
ret = e->to;
}
reached[q[open++]=e->to] = true;
}
}
}
return ret;
}
int main()
{
memset(first, 0, sizeof(first));
scanf("%d", &n);
Edge *cur = edges;
for (int i = 1; i < n; ++i)
{
int p, q, d;
scanf("%d%d%d", &p, &q, &d);
cur->to = q;
cur->len = d;
cur->next = first[p];
first[p] = cur;
++cur;
cur->to = p;
cur->len = d;
cur->next = first[q];
first[q] = cur;
++cur;
}
int a = getF(1);
int b = getF(a);
int ans = mlen;
double tu = ans;
double ta = tu * 10.0 + tu * (tu+1) / 2.0;
printf("%.0lf\n", ta);
return 0;
}
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main{
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
String result[] = new String[n];
int count = 0;
while (n > 0) {
String data = br.readLine();
int index_C = data.indexOf('C');
int x = Integer.parseInt(data.substring(1, index_C));
int y = Integer.parseInt(data.substring(index_C + 1, data.length()));
String address = "";
while (y > 26) {
int mo = y % 26;
y /= 26;
if (mo == 0) {
// 因为是整除,比如702(26*27)%26==0
// y = 702 / 26 = 27,那么可以把26*27看成26*(26+1)--> 26 * 26(Z) + 26(Z)
address = "Z" + address;
y -= 1;// 减去一个1,是因为已经拿出一个Z来表示了
} else
address = (char) (mo + 64) + address;
}
address = (char) (y + 64) + address + x;
result[count++] = address;
n--;
}
for (int i = 0; i < result.length; i++) {
System.out.println(result[i]);
}
}
}
资源约定:
峰值内存消耗 < 64M
CPU消耗 < 3000ms
方法一:用数组记录值
import java.util.*;
public class Main
{
static final int N = 1000 * 100;
static int se(int[] da, int a)
{
int n=0;
for(int i=0; i=a) return i-a;
}
else
n = 0;
}
return -1;
}
static void f(int a, int b)
{
int[] da = new int[N];
for(int i=0; i<=N/a; i++)
{
for(int j=0; j<=(N-i*a)/b; j++)
{
if(i*a + b*j < N) da[i*a+b*j] = 1;
}
}
System.out.println(se(da, a));
}
public static void main(String[] args)
{
Scanner scan = new Scanner(System.in);
int num1 = scan.nextInt();
int num2 = scan.nextInt();
f(num1,num2);
}
}
方法二:逆向判断该数是否能凑成
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
int max = 0;
int num1 = 0, num2 = 0;
String strTemp = "";
Scanner scan = new Scanner(System.in);
strTemp = scan.nextLine();
String temp[] = strTemp.split(" ");
num1 = Integer.valueOf(temp[0]);
num2 = Integer.valueOf(temp[1]);
int maxNum = Math.max(num1, num2);
int minNum = Math.min(num1, num2);
int temNum1, temNum2;
max = maxNum * maxNum;
for (int i = max; i > maxNum; i--) {
temNum1 = i / maxNum;
if (i % maxNum != 0 && i % minNum != 0) {
for (int v = temNum1; v >= 1; v--) {
temNum2 = i - maxNum * v;
if (temNum2 % minNum != 0) {
temNum1--;
}
}
}
if (temNum1 == 0) {
System.out.println(i);
break;
}
}
}
}
7.匪警请拨110,即使手机欠费也可拨通!
// 数字间填写符号 + -
// 1 2 3 4 5 6 7 8 9 = 110;
import java.util.*;
public class B33
{
public static void f(String cur, int goal, List lst)
{
if(lst.size()==0) return;
int a = lst.remove(lst.size()-1);
if(lst.size()==0)
{
if(goal==a) System.out.println(a + cur);
return;
}
List lst2 = new Vector();
lst2.addAll(lst);
List lst3 = new Vector();
lst3.addAll(lst);
f("+" + a + "" + cur, goal-a, lst2);
f("-" + a + "" + cur, goal+a, lst3);
int b = lst.remove(lst.size()-1);
lst.add(Integer.parseInt(b+""+a));
f(cur, goal, lst);
}
public static void main(String[] args)
{
List lst = new Vector();
for(int i=1; i<=9; i++) lst.add(i);
f("", 110, lst);
}
}
1110110
public class RiCheng
{
static int N = 0;
public static void show(int[][] a)
{
for(int i=0; i<5; i++)
{
for(int j=0; j<7; j++)
{
System.out.print(a[i][j]);
}
System.out.println();
}
}
public static void ping_jia(int[][] a)
{
// 连续工作不多于3天
for(int i=0; i<5; i++)
{
int sum = 0;
for(int j=0; j<14; j++)
{
if(a[i][j%7]==0)
sum = 0;
else
{
sum++;
if(sum>3) return;
}
}
}
// 至少有3天所有人都上班
int k = 0;
for(int i=0; i<7; i++)
{
if(a[0][i]==0 || a[1][i]==0 || a[2][i]==0 || a[3][i]==0 || a[4][i]==0) k++;
}
if(k==7||k==6||k==5) return;
// A B C D 中保证有2人上班
for(int i=0; i<7; i++)
{
int m = 0;
if(a[0][i]==1) m++;
if(a[1][i]==1) m++;
if(a[2][i]==1) m++;
if(a[3][i]==1) m++;
if(m<2) return;
}
// B D E 周日必须休息
if(a[1][6]==1 || a[3][6]==1 || a[4][6]==1) return;
// A E 周三必须上班
if(a[0][2]==0 || a[4][2]==0) return;
// A 与 C 一周中必须至少有4天能见面
k=0;
for(int i=0; i<7; i++)
{
if(a[0][i]==1 && a[2][i]==1) k++;
}
if(k<4) return;
N++;
show(a);
System.out.println("");
}
public static void f(int[][] a, int row)
{
if(row==5)
{
ping_jia(a);
return;
}
for(int i=0; i<7; i++)
{
for(int j=i+1; j<7; j++)
{
for(int k=0; k<7; k++) a[row][k] = 1;
a[row][i] = 0;
a[row][j] = 0;
f(a, row+1);
}
}
}
public static void main(String[] args)
{
int[][] a = {{1,1,1,1,1,0,0},{1,1,1,1,1,0,0},{1,1,1,1,1,0,0},
{1,1,1,1,1,0,0},{1,1,1,1,1,0,0},};
f(a,0);
System.out.println("N=" + N);
}
}