最大比例
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 4 3125 32 32 200 3 549755813888 524288 2
输出样例
25/4 5/2 4/1
#include <bits/stdc++.h> using namespace std; typedef long long ll; ll a[105]; map<ll,int> m; //大于返回true; bool cmp(ll i,ll j,ll m,ll n) { return m*j > i*n; } int main() { int n; cin>>n; int top = 0; for(int i = 0; i < n; i++) { ll tmp; cin>>tmp; if(m[tmp] == 0) { m[tmp] = 1; a[top++] = tmp; } } sort(a,a+top); ll t1 = a[0], t2 = a[1]; for(int i = 1; i < top-1; i++) { if(cmp(t1,t2,a[i],a[i+1])) { t1 = a[i]; t2 = a[i+1]; } } ll a = __gcd(t1,t2); t2 /= a; t1 /= a; cout<<t2<<'/'<<t1; return 0; }
凑算式
这个算式中A~I代表1~9的数字,不同的字母代表不同的数字。
比如:
6+8/3+952/714 就是一种解法,5+3/1+972/486 是另一种解法。
这个算式一共有多少种解法?
输出格式
输出一个整数表示答案
傻逼吧,麻烦把题目条件改为1到9 #include<bits/stdc++.h> using namespace std; int s[9]={1,2,3,4,5,6,7,8,9}; int main() { int res=0,a,b,c; do{ a=s[0]; int b=s[1]*(s[6]*100+s[7]*10+s[8])+s[2]*(s[3]*100+s[4]*10+s[5]); int c=s[2]*(s[6]*100+s[7]*10+s[8]); if(a+b/c==10&&b%c==0) { res++; } }while(next_permutation(s,s+9)); cout<<res; return 0; }
四平方和
四平方和定理,又称为拉格朗日定理:每个正整数都可以表示为至多4个正整数的平方和。
如果把0包括进去,就正好可以表示为4个数的平方和。
比如:
5 = 0^2 + 0^2 + 1^2 + 2^2
7 = 1^2 + 1^2 + 1^2 + 2^2(^符号表示乘方的意思)
对于一个给定的正整数N,可能存在多种平方和的表示法。
要求你对4个数排序:0 <= a <= b <= c <= d
并对所有的可能表示法按 a,b,c,d 为联合主键升序排列,最后输出第一个表示法
输入格式
输入存在多组测试数据,每组测试数据输入一行为一个正整数N (N<5000000)
输出格式
对于每组测试数据,要求输出4个非负整数,按从小到大排序,中间用空格分开
输入样例
5 12 773535
输出样例
0 0 1 2 0 2 2 2 1 1 267 838
#include<bits/stdc++.h> using namespace std; int main( ) { int n; cin>>n; for(int a=0;a<10000;a++) { for(int b=0;b<10000;b++) { for(int c=0;c<10000;c++) { for(int d=c;d<10000;d++) { if(a*a+b*b+c*c+d*d==n) { cout<<a<<" "<<b<<" "<<c<<" "<<d; exit(0); } if(a*a+b*b+c*c+d*d>n) break; } if(a*a+b*b+c*c>n) break; } if(a*a+b*b>n) break; } if(a*a>n) break; } return 0; }
交换瓶子
有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 5 5 4 3 2 1
输出样例
3 2
#include<iostream> using namespace std; int ans=0; int a[10000]; int n; int pos(int x) { for(int i=1;i<=n;i++) { if(a[i]==x) return i; } return -1; } void swap(int i,int j) { int t=a[i]; a[i]=a[j]; a[j]=t; } int main() { cin>>n; for(int i=1;i<=n;i++) { cin>>a[i]; } for(int i=1;i<=n;i++) { if(a[i]!=i) { swap(pos(i),i); ans++; } if(a[i]==i) continue; } cout<<ans; }
移动距离
X星球居民小区的楼房全是一样的,并且按矩阵样式排列。
其楼房的编号为1,2,3... 当排满一行时,从下一行相邻的楼往反方向排号。
比如:当小区排号宽度为6时,开始情形如下:
1 2 3 4 5 612 11 10 9 8 713 14 15 .....
我们的问题是:已知了两个楼号m和n,需要求出它们之间的最短移动距离
(不能斜线方向移动)
输入格式
输入存在多组测试数据
输入为3个整数w m n,空格分开,都在1到10000范围内
w为排号宽度,m,n为待计算的楼号。
输出格式
要求输出一个整数,表示m n 两楼间最短移动距离。
输入样例 复制
6 8 2 4 7 20
输出样例 复制
4 5
#include<iostream> #include<cmath> using namespace std; int main() { int w, m, n, temp; int i = 0, j = 0,k = 0, temp1 = 0, temp2 = 0; while(cin >> w >> m >> n) { int sum = 0; i = 0, j = 0,k = 0, temp1 = 0, temp2 = 0; if(m > n) { temp = m; m = n; n = temp; } while(i < m) { i += w; j += 1; }//m在第j行 for(int p = i - w; p <= i; p ++, temp1 ++) if(p == m) break; if(j % 2 == 0) temp1 = w - temp1 + 1; //m在第j行从左到右第temp1列 i=0; while(i<n) { i += w; k += 1; }//n在第k行 for(int p = i - w; p <= i; p ++, temp2 ++) if(p == n)break; if(k % 2 == 0)temp2 = w - temp2 + 1;//n在第k行从左到右第temp2列 sum += k - j + abs(temp2 - temp1);//总距离为行数差+列数差 cout << sum << endl; } return 0; }