淮安哪里有做网站的/搜索引擎优化简称seo
1.交换瓶子
有N个瓶子,编号 1 ~ N,放在架子上。比如有5个瓶子:
2 1 3 5 4要求每次拿起2个瓶子,交换它们的位置。
经过若干次后,使得瓶子的序号为:
1 2 3 4 5对于这么简单的情况,显然,至少需要交换2次就可以复位。如果瓶子更多呢?你可以通过编程来解决。输入格式为两行:
第一行: 一个正整数N(N<10000), 表示瓶子的数目
第二行:N个正整数,用空格分开,表示瓶子目前的排列情况。输出数据为一行一个正整数,表示至少交换多少次,才能完成排序。例如,输入:
5
3 1 2 5 4程序应该输出:
3再例如,输入:
5
5 4 3 2 1程序应该输出:
2
资源约定:
峰值内存消耗 < 256M
CPU消耗 < 1000ms请严格按要求输出,不要画蛇添足地打印类似:“请您输入...” 的多余内容。所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。注意: main函数需要返回0
注意: 只使用ANSI C/ANSI C++ 标准,不要调用依赖于编译环境或操作系统的特殊函数。
注意: 所有依赖的函数必须明确地在源文件中 #include <xxx>, 不能通过工程设置而省略常用头文件。提交时,注意选择所期望的编译器类型。
交换瓶子
#include <cstdio>#include <cstring>#include <cmath>#include <vector>#include <algorithm>using namespace std;const int maxn = 10240;int N, v[maxn], pos[maxn];int main() {int N; scanf("%d", &N);for(int i = 1; i <= N; ++i) {scanf("%d", &v[i]);pos[v[i]] = i;}int cnt = 0;for(int i = 1; i <= N; ++i) {if(v[i] == i) continue;++cnt;int ne = pos[i];int t = v[i];v[ne] = t;v[i] = i;pos[t] = ne;pos[i] = i;}printf("%d\n", cnt);return 0;}
2.卡片换位
你玩过华容道的游戏吗?
这是个类似的,但更简单的游戏。
看下面 3 x 2 的格子+---+---+---+
| A | * | * |
+---+---+---+
| B | | * |
+---+---+---+在其中放5张牌,其中A代表关羽,B代表张飞,* 代表士兵。
还有一个格子是空着的。你可以把一张牌移动到相邻的空格中去(对角不算相邻)。
游戏的目标是:关羽和张飞交换位置,其它的牌随便在哪里都可以。输入格式:
输入两行6个字符表示当前的局面输出格式:
一个整数,表示最少多少步,才能把AB换位(其它牌位置随意)例如,输入:
* A
**B程序应该输出:
17再例如,输入:
A B
***程序应该输出:
12
资源约定:
峰值内存消耗 < 256M
CPU消耗 < 1000ms请严格按要求输出,不要画蛇添足地打印类似:“请您输入...” 的多余内容。所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。注意: main函数需要返回0
注意: 只使用ANSI C/ANSI C++ 标准,不要调用依赖于编译环境或操作系统的特殊函数。
注意: 所有依赖的函数必须明确地在源文件中 #include <xxx>, 不能通过工程设置而省略常用头文件。提交时,注意选择所期望的编译器类型。
#include <stdio.h>
int min = 99999999;
int sx[4] = {0, 0, 1, -1};
int sy[4] = {1, -1, 0, 0};
char s[3][3][3][3][3][3] = {0};struct pos{int x;int y;
}ap, bp, k;void f(int x1, int y1, int x2, int y2, int x, int y, int n)
{if(n > min)return ;if(x1 == bp.x && y1 == bp.y && x2 == ap.x && y2 == ap.y){if(n < min)min = n;return ;}if(x > 2 || x < 0 || y > 1 || y < 0)return ;if(x1 > 2 || x1 < 0 || y1 > 1 || y1 < 0)return ;if(x2 > 2 || x2 < 0 || y2 > 1 || y2 < 0)return ;if(s[x1][y1][x2][y2][x][y] == 1)return;s[x1][y1][x2][y2][x][y] = 1;for(int i = 0; i < 4; i++){int tx = x+sx[i];int ty = y+sy[i];if(tx == x1 && ty == y1){f(x, y,x2,y2,x1,y1,n+1);}else if(tx == x2 && ty == y2){f(x1,y1,x,y,x2,y2,n+1);}elsef(x1,y1,x2,y2,tx,ty,n+1);}s[x1][y1][x2][y2][x][y] = 0;}int main(){char c;for(int i = 0; i < 2; i++){for(int j = 0; j < 3; j++){c = getchar();if(c == ' '){k.x = j;k.y = i;}if(c == 'A'){ap.x = j;ap.y = i;}if(c == 'B'){bp.x = j;bp.y = i;} }getchar();}f(ap.x, ap.y, bp.x, bp.y, k.x, k.y, 0);printf("%d", min);return 0;}
3.密码脱落
X星球的考古学家发现了一批古代留下来的密码。
这些密码是由A、B、C、D 四种植物的种子串成的序列。
仔细分析发现,这些密码串当初应该是前后对称的(也就是我们说的镜像串)。
由于年代久远,其中许多种子脱落了,因而可能会失去镜像的特征。你的任务是:
给定一个现在看到的密码串,计算一下从当初的状态,它要至少脱落多少个种子,才可能会变成现在的样子。输入一行,表示现在看到的密码串(长度不大于1000)
要求输出一个正整数,表示至少脱落了多少个种子。例如,输入:
ABCBA
则程序应该输出:
0再例如,输入:
ABDCDCBABC
则程序应该输出:
3资源约定:
峰值内存消耗 < 256M
CPU消耗 < 1000ms请严格按要求输出,不要画蛇添足地打印类似:“请您输入...” 的多余内容。所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。注意: main函数需要返回0
注意: 只使用ANSI C/ANSI C++ 标准,不要调用依赖于编译环境或操作系统的特殊函数。
注意: 所有依赖的函数必须明确地在源文件中 #include <xxx>, 不能通过工程设置而省略常用头文件。提交时,注意选择所期望的编译器类型。题目描述中A B C D 四种,
但示例中含有字母 E。
可以只用这个示例理解题意。
测评数据会保证只有ABCD这4个字母
import java.util.Arrays;
import java.util.Scanner;public class Main {public static Scanner in = new Scanner(System.in);static char[] arr;
static int[][] buf;static int f(int left, int right) {if (left >= right) {return 0;}if (arr[left] == arr[right]) {if (buf[left + 1][right - 1] == -1) {buf[left + 1][right - 1] = f(left + 1, right - 1);}return buf[left + 1][right - 1];}if (buf[left + 1][right] == -1) {buf[left + 1][right] = f(left + 1, right);}if (buf[left][right - 1] == -1) {buf[left][right - 1] = f(left, right - 1);}return 1 + Math.min(buf[left + 1][right], buf[left][right - 1]);
}public static void main(String[] args) {arr = in.next().toCharArray();buf = new int[arr.length][arr.length];for (int i = 0; i < arr.length; i++)Arrays.fill(buf[i], -1);System.out.println(f(0, arr.length - 1));
}
}
4.取球博弈
两个人玩取球的游戏。
一共有N个球,每人轮流取球,每次可取集合{n1,n2,n3}中的任何一个数目。
如果无法继续取球,则游戏结束。
此时,持有奇数个球的一方获胜。
如果两人都是奇数,则为平局。假设双方都采用最聪明的取法,
第一个取球的人一定能赢吗?
试编程解决这个问题。输入格式:
第一行3个正整数n1 n2 n3,空格分开,表示每次可取的数目 (0<n1,n2,n3<100)
第二行5个正整数x1 x2 ... x5,空格分开,表示5局的初始球数(0<xi<1000)输出格式:
一行5个字符,空格分开。分别表示每局先取球的人能否获胜。
能获胜则输出+,
次之,如有办法逼平对手,输出0,
无论如何都会输,则输出-例如,输入:
1 2 3
1 2 3 4 5程序应该输出:
+ 0 + 0 -再例如,输入:
1 4 5
10 11 12 13 15程序应该输出:
0 - 0 + +再例如,输入:
2 3 5
7 8 9 10 11程序应该输出:
+ 0 0 0 0资源约定:
峰值内存消耗(含虚拟机) < 256M
CPU消耗 < 3000ms请严格按要求输出,不要画蛇添足地打印类似:“请您输入...” 的多余内容。所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。
注意:不要使用package语句。不要使用jdk1.7及以上版本的特性。
注意:主类的名字必须是:Main,否则按无效代码处理。
4、取球博弈
import java.util.Scanner;public class Main {
static int[] canGet=new int[3];
static int left=2;
static int[] arr=new int[2];static int[][][] cache;//=new int[2][1000][1000];
public static void main(String[] args) {Scanner sc=new Scanner(System.in);for (int i = 0; i < 3; i++) {canGet[i]=sc.nextInt();}for (int k = 0; k < 5; k++) {int num=sc.nextInt();cache=new int[2][num+1][num+1];for (int i = 0; i < 2; i++) {for (int j = 0; j < num+1; j++) {for (int j2 = 0; j2 < num+1; j2++) {cache[i][j][j2]=-999;}}}int ans=dfs(0, num,0,0);if (ans==1) {System.out.print("+");}if (ans==-1) {System.out.print("-");}if (ans==0) {System.out.print("0");} if (k!=4) {System.out.print(" ");}}System.out.println();
}
public static int dfs(int who,int left,int a,int b){if (left<canGet[0]&&left<canGet[1]&&left<canGet[1]) {if (who==0) {if (a%2==1 && b%2==0) {return 1;}if (a%2==1 && b%2==1||(b%2==0 && a%2==0)) {return 0;}}if (who==1) {if (b%2==1 && a%2==0) {return 1;}if ((b%2==1 && a%2==1)||(b%2==0 && a%2==0)) {return 0;}}return -1;}if (cache[who][a][b]!=-999) {return cache[who][a][b];}int canWin=-999;for (int i = 0; i < canGet.length; i++) {if (left-canGet[i]>=0) {int nextwho=1-who;if (who==0) {canWin=Math.max(canWin, -dfs(1-who, left-canGet[i],a+canGet[i],b));} else {canWin=Math.max(canWin, -dfs(1-who, left-canGet[i],a,b+canGet[i]));}}}cache[who][a][b]=canWin;return canWin;
}
}
5.四平方和
四平方和定理,又称为拉格朗日定理:
每个正整数都可以表示为至多4个正整数的平方和。
如果把0包括进去,就正好可以表示为4个数的平方和。比如:
5 = 0^2 + 0^2 + 1^2 + 2^2
7 = 1^2 + 1^2 + 1^2 + 2^2
(^符号表示乘方的意思)对于一个给定的正整数,可能存在多种平方和的表示法。
要求你对4个数排序:
0 <= a <= b <= c <= d
并对所有的可能表示法按 a,b,c,d 为联合主键升序排列,最后输出第一个表示法程序输入为一个正整数N (N<5000000)
要求输出4个非负整数,按从小到大排序,中间用空格分开例如,输入:
5
则程序应该输出:
0 0 1 2再例如,输入:
12
则程序应该输出:
0 2 2 2再例如,输入:
773535
则程序应该输出:
1 1 267 838资源约定:
峰值内存消耗 < 256M
CPU消耗 < 3000ms请严格按要求输出,不要画蛇添足地打印类似:“请您输入...” 的多余内容。所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。注意: main函数需要返回0
注意: 只使用ANSI C/ANSI C++ 标准,不要调用依赖于编译环境或操作系统的特殊函数。
注意: 所有依赖的函数必须明确地在源文件中 #include <xxx>, 不能通过工程设置而省略常用头文件。提交时,注意选择所期望的编译器类型。
5、四平方和
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main(){
ll n;
while(cin>>n){ll am = ceil(sqrt(n));for(ll a = 0; a <= am; a++){ll bm = ceil(sqrt(n - a * a));for(ll b = a; b <= bm; b++){ll cm = ceil(sqrt(n - a * a - b * b));for(ll c = b; c <= cm; c++){ll dv = n - a * a - b * b - c * c;ll dm = sqrt(dv);if(dm * dm == dv && dm >= c){cout<<a<<" "<<b<<" "<<c<<" "<<dm<<endl;goto end;}}}}
end:n = 1;
}
return 0;
}
6.压缩变换
小明最近在研究压缩算法。
他知道,压缩的时候如果能够使得数值很小,就能通过熵编码得到较高的压缩比。
然而,要使数值很小是一个挑战。最近,小明需要压缩一些正整数的序列,这些序列的特点是,后面出现的数字很大可能是刚出现过不久的数字。对于这种特殊的序列,小明准备对序列做一个变换来减小数字的值。变换的过程如下:
从左到右枚举序列,每枚举到一个数字,如果这个数字没有出现过,刚将数字变换成它的相反数,如果数字出现过,则看它在原序列中最后的一次出现后面(且在当前数前面)出现了几种数字,用这个种类数替换原来的数字。比如,序列(a1, a2, a3, a4, a5)=(1, 2, 2, 1, 2)在变换过程为:
a1: 1未出现过,所以a1变为-1;
a2: 2未出现过,所以a2变为-2;
a3: 2出现过,最后一次为原序列的a2,在a2后、a3前有0种数字,所以a3变为0;
a4: 1出现过,最后一次为原序列的a1,在a1后、a4前有1种数字,所以a4变为1;
a5: 2出现过,最后一次为原序列的a3,在a3后、a5前有1种数字,所以a5变为1。
现在,给出原序列,请问,按这种变换规则变换后的序列是什么。输入格式:
输入第一行包含一个整数n,表示序列的长度。
第二行包含n个正整数,表示输入序列。输出格式:
输出一行,包含n个数,表示变换后的序列。例如,输入:
5
1 2 2 1 2程序应该输出:
-1 -2 0 1 1再例如,输入:
12
1 1 2 3 2 3 1 2 2 2 3 1程序应该输出:
-1 0 -2 -3 1 1 2 2 0 0 2 2数据规模与约定
对于30%的数据,n<=1000;
对于50%的数据,n<=30000;
对于100%的数据,1 <=n<=100000,1<=ai<=10^9资源约定:
峰值内存消耗(含虚拟机) < 256M
CPU消耗 < 3000ms请严格按要求输出,不要画蛇添足地打印类似:“请您输入...” 的多余内容。所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。
注意:不要使用package语句。不要使用jdk1.7及以上版本的特性。
注意:主类的名字必须是:Main,否则按无效代码处理。
import java.util.Scanner;public class Main {
public static void main(String[] args) {// TODO Auto-generated method stubScanner input=new Scanner(System.in);int n=input.nextInt();int[][] a=new int[3][n];for(int i=0;i<n;i++)a[0][i]=a[1][i]=-1;int index=0;boolean find=false;int[] b=new int[n];int num=0;for(int i=0;i<b.length;i++){int c=input.nextInt();find=false;for(int j=0;j<index;j++)if(a[0][j]==c){num=0;for(int k=0;k<index;k++){if(a[1][k]>a[1][j])num++;}b[i]=num;a[1][j]=i;find=true;}if(!find){b[i]=(-1)*c;a[0][index]=c;a[1][index]=i;a[2][index]=0;index++;}}for(int i=0;i<b.length;i++){System.out.print(b[i]+" ");}System.out.println();
}
}
7.最大比例
X星球的某个大奖赛设了M级奖励。每个级别的奖金是一个正整数。
并且,相邻的两个级别间的比例是个固定值。
也就是说:所有级别的奖金数构成了一个等比数列。比如:
16,24,36,54
其等比值为:3/2现在,我们随机调查了一些获奖者的奖金数。
请你据此推算可能的最大的等比值。输入格式:
第一行为数字 N (0<N<100),表示接下的一行包含N个正整数
第二行N个正整数Xi(Xi<1 000 000 000 000),用空格分开。每个整数表示调查到的某人的奖金数额要求输出:
一个形如A/B的分数,要求A、B互质。表示可能的最大比例系数测试数据保证了输入格式正确,并且最大比例是存在的。例如,输入:
3
1250 200 32程序应该输出:
25/4再例如,输入:
4
3125 32 32 200程序应该输出:
5/2再例如,输入:
3
549755813888 524288 2程序应该输出:
4/1资源约定:
峰值内存消耗 < 256M
CPU消耗 < 3000ms请严格按要求输出,不要画蛇添足地打印类似:“请您输入...” 的多余内容。所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。注意: main函数需要返回0
注意: 只使用ANSI C/ANSI C++ 标准,不要调用依赖于编译环境或操作系统的特殊函数。
注意: 所有依赖的函数必须明确地在源文件中 #include <xxx>, 不能通过工程设置而省略常用头文件。提交时,注意选择所期望的编译器类型。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int N;
vector<ll> a;double eps = 1e-8;bool cifang(double x, double res){
//x^n == res
int n = (log(res) / log(x) + 0.5);
//cerr<<"ci n = "<<log(res)/log(x)<<endl;
return fabs(res - pow(x, n)) < eps;
}int main(){
//cout<<1250.0/32<<" = "<<25.0/4*25.0/4<<endl;
cin>>N;
a = vector<ll>(N, 0);
for(int i = 0; i < N; i++){cin>>a[i];
}
sort(a.begin(), a.end());
a.erase(unique(a.begin(), a.end()), a.end());if(a.size() == 1){cout<<"1/1"<<endl; return 0;
}// 2, 8, 16 -> 2
vector<ll> b(a.size());
vector<ll> bm(a.size());for(int i = 1; i < a.size(); i++){ll g = __gcd(a[i], a[0]);b[i] = a[i] / g; //mainbm[i] = a[0] / g;
}//for(int i = 1; i < b.size(); i++) cerr<<b[i]<<" ";cerr<<endl;
//for(int i = 1; i < bm.size(); i++) cerr<<bm[i]<<" ";cerr<<endl;for(int ci = 1; ; ci++){ll t = b[1];ll nt = pow(1.0 * t, 1.0 / ci) + 0.5;//cerr<<"ci = "<<ci<<" nt = "<<nt<<endl;bool check = 1;for(int i = 1; i < b.size(); i++){check &= cifang(nt, b[i]);}if(check) {ll fenzi = nt;ll fenmu = pow(1.0 * bm[1], 1.0 / ci) + 0.5;cout<<fenzi<<"/"<<fenmu<<endl; break;}
}
return 0;
}