比赛链接:https://www.nowcoder.com/activity/2018codem/index?from=meituan
1、下单
给定若干商品,可以选择打折、满减两种方式。
#include <stdio.h>
#include <algorithm>
#include <iostream>
using namespace std;
struct Manjian {
int x, y;
};
const int N = 107;
const int M = 1007;
int price[N];
int can[N];
Manjian manjian[M];
int n, m;
int main() {
// freopen("in.txt", "r", stdin);
cin >> n >> m;
for (int i = 0; i < n; i++) {
cin >> price[i] >> can[i];
}
for (int i = 0; i < m; i++) {
cin >> manjian[i].x >> manjian[i].y;
}
double useZheco = 0;
for (int i = 0; i < n; i++) {
if (can[i]) {
useZheco += 0.8 * price[i];
}else{
useZheco+=price[i];
}
}
double jian = 0xfffffff;
double s = 0;
for (int i = 0; i < n; i++) s += price[i];
for (int i = 0; i < m; i++) {
if (manjian[i].x <= s) {
jian = min(s - manjian[i].y, jian);
}
}
double ans = min(jian, useZheco);
printf("%.2f\n",ans);
return 0;
}
2、买可乐
此题看上去可乐可以买多种,实际上只能买一种。因为每种可乐都是不限数量的,如果限制数量那也很简单,也是一个排序问题。
#include <stdio.h>
#include <algorithm>
#include <iostream>
using namespace std;
const int MAXN=1e4+7;
int n,m,k;
int a[MAXN],b[MAXN];
int buy[MAXN];
double good(int x){
return a[x]*m+b[x]*(n-m);
}
int main() {
//freopen("in.txt", "r", stdin);
cin>>n>>m>>k;
int ans=0;
for(int i=0;i<k;i++){
cin>>a[i]>>b[i];
}
for(int i=0;i<k;i++){
if(good(i)>=good(ans)){
ans=i;
}
}
buy[ans]=n;
cout<<buy[0];
for(int i=1;i<k;i++){
cout<<" "<<buy[i];
}
cout<<endl;
return 0;
}
3、世界杯足球赛
16支球队组成一颗4层的二叉树,求每支球队到达根的概率。
#include <stdio.h>
#include <algorithm>
#include <iostream>
using namespace std;
const int MAXN = 1e4 + 7;
double a[17][17];
struct Node {
double a[17];
};
Node b[100];
void solve(int x) {
for (int i = 0; i < 16; i++) b[x].a[i] = 0;
if (x >= 16) {
b[x].a[x - 16] = 1;
} else {
solve(x << 1);
solve((x << 1) | 1);
for (int i = 0; i < 16; i++) {
for (int j = 0; j < 16; j++) {
b[x].a[i] += a[i][j] * b[x << 1].a[i] * b[x << 1 | 1].a[j];
b[x].a[j] += a[j][i] * b[x << 1].a[i] * b[x << 1 | 1].a[j];
}
}
}
//cout<<x<<endl;
//cout<<"======"<<endl;
//for(int i=0;i<16;i++)cout<<" "<<b[x].a[i];
//cout<<endl;
}
int main() {
// freopen("in.txt", "r", stdin);
for (int i = 0; i < 16; i++) {
for (int j = 0; j < 16; j++) {
cin >> a[i][j];
}
}
solve(1);
cout << b[1].a[0];
for (int i = 0; i < 16; i++) {
cout << " " << b[1].a[i];
}
cout << endl;
return 0;
}