1、进制均值
数A按2到A-1进制表达 ,各个位数之和的均值多少?输入多组测试数据
例 | 输出 |
5 | 7/3 |
3 | 2/1 |
思路
进制位数均值
sum+=A%x
A=A/x
输出结果是分数可能需要约分 利用最大公约数
代码
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
int hexsum(int x,int a){
int ans=0;
while(x){
ans+=x%a;
x/=a;
}
return ans;
}
int gcd(int x,int y){
if(x==0) return y;
if(y==0) return x;
if(x%2==0&&y%2==0) return 2*gcd(x>>1,y>>1);
else if(x%2==0) return gcd(x>>1,y);
else if (y%2==0) return gcd(x,y>>1);
else return gcd(min(x,y),fabs(y-x));
}
int main() {
int x;
while(cin>>x){
int sum=0;
for(int i=2;i<x;i++){
sum+=hexsum(x,i);
}
int r=gcd(sum,x-2);
cout << sum/r<<"/"<<(x-2)/r<<endl;
}
return 0;
}
2、集合
多组{A}+{B}
样例输入
1 2
1
23
1 2
1
1 2
输出
1 2 3
1 2
思路
利用集合
set<int> s;
s.insert(x);
集合遍历
set<int> ::iterator it;
for(it=s.begin();it!=s.end();++it)
代码
#include <iostream>
#include <stdio.h>
#include <set>
using namespace std;
int main() {
int n,m;
while(cin>>n>>m){
set <int> s;
for(int i=0;i<n;i++){
int x;
cin>>x;
s.insert(x);
}
for(int i=0;i<m;i++){
int x;
cin>>x;
s.insert(x);
}
set<int>::iterator it;
for (it = s.begin(); it != s.end(); it++){
printf("%d ", *it);
}
printf("\n");
}
return 0;
}
3、通过考试
一共n道题,每题作对概率pi,求至少60%概率 输出保留小数点后五位
输入
4
50 50 50 50 50
输出
0.31250
思路
四题作对60% 至少3道
n道 60% (3*n+4)/5
保留5位小数
printf("%.5f\n".ans)
dp[i][j]表示前道作对j道的概率
输出dp[n][i] i>=(3*n+4)/5
代码
#include <iostream>
#include <stdio.h>
using namespace std;
int main() {
const int N=100;
int n;
cin>>n;
int p[n];
double dp[N][N]={0};
for(int i=1;i<=n;i++){
cin>>p[i];
}
dp[0][0]=1;
for(int i=1;i<=n;i++){
dp[i][0]=dp[i-1][0]*(100-p[i])/100;
for(int j=1;j<=i;j++){
dp[i][j]=dp[i-1][j]*(100-p[i])/100+dp[i-1][j-1]*1.0*p[i]/100;
}
}
int begin=(3*n+4)/5;
double ans=0;
for(int i=begin;i<=n;i++){
ans+=dp[n][i];
}
printf("%.5f\n",ans);
return 0;
}
4、异或
两个n位数,异或后十进制
输入
4
1100
0100
输出
8
思路
先转换为十进制,再异或输出
二进制转十进制注意先乘以2 再加
ans*=2;
ans+=s[i]-'0'
代码
#include <iostream>
#include <string>
using namespace std;
int slove(string s,int n){
int ans=0;
for(int i=0;i<n;i++){
ans*=2;
ans+=s[i]-'0';
}
return ans;
}
int main() {
int n;
cin>>n;
string s;
cin>>s;
int a=slove(s,n);
cin>>s;
int b=slove(s,n);
cout<<(a^b)<<endl;
return 0;
}
5、拍卖产品
n件 m人买 出价v[i] 求最大利润
输入
5 4
2 10 8 7
输出
7
思路
输入v[i]
对V[i]排序
调用#include<algorithm>
sort(v+1,v+m+1);
ans=max(v[i]*(m-i+1))
pos=v[i]
代码
#include <iostream>
#include<algorithm>
using namespace std;
int main() {
const int N=1000;
int m,n,pos,ans=0;
int v[N];
cin>>m>>n;
for(int i=1;i<=m;i++){
cin>>v[i];
}
sort(v+1,v+m+1);
for(int i=1;i<=m;i++){
if(ans<v[i]*min(n,m-i+1)){
ans=v[i]*min(n,m-i+1);
pos=v[i];
}
}
cout << pos;
return 0;
}