codeM 2018 初赛试题

比赛链接: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;
}

猜你喜欢

转载自www.cnblogs.com/weiyinfu/p/9127063.html
今日推荐