250pt

题意:上帝知道一个“先有鸡还是先有蛋”的答案,上帝和N<=10^6个人说了答案,不过有x个人故意告诉了他们错误的答案,然后有一个人问了这N个人问题的答案,有M个人说先有鸡,N-M个人说现有蛋,已知其中有y个人故意说了上帝告诉他们的相反的答案。现在给N M x y,问是否能推测出答案,或者多解,或者无解。

思路:因为N很小,直接枚举那些人说谎,然后判定即可。

500pt

题意:有N<=50个任务,每个任务有运行时间和用户,机器同一个时间只能跑一个任务,一个任务运行中不能中断,每个用户可能有多个任务,每个用户的等待时间为他的最后一个任务完成前等待的时间。电脑安排任务始终保证所有用户的平均等待时间最短,在这个条件下, 每个schedule都有同等的可能性。现在给你N个任务的信息,问每个任务期望的结束时间是多少。

思路:很明显,对于某个人的任务,那么一定是连着运行对于结果最优。

那么那么如果a与b的任务运行时间相同,那么他们两个是可以交换的。

同时,对于同一user的任务间,顺序任意。接下去便是统计了。注意任务是等概率的就好做了。

code:

 // BEGIN CUT HERE
/* */
// END CUT HERE
#line 7 "BatchSystemRoulette.cpp"
#include <cstdlib>
#include <cctype>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <vector>
#include <string>
#include <iostream>
#include <sstream>
#include <map>
#include <set>
#include <queue>
#include <stack>
#include <fstream>
#include <numeric>
#include <iomanip>
#include <bitset>
#include <list>
#include <stdexcept>
#include <functional>
#include <utility>
#include <ctime>
using namespace std; #define PB push_back
#define MP make_pair typedef vector<int> VI;
typedef vector<string> VS;
typedef vector<double> VD;
typedef long long LL;
typedef pair<int, int> PII;
struct oo{
int val, id;
string usr;
oo(){}
oo(int _val, int _id, string _usr): val(_val), id(_id), usr(_usr){}
bool operator<(const oo &b)const{
return usr < b.usr || (usr == b.usr && val < b.val);
}
};
int P[], S[], last[];
long long sum[];
class BatchSystemRoulette
{
public:
vector <double> expectedFinishTimes(vector <int> dur, vector <string> user)
{
vector<oo> v;
v.clear();
for (int i = ; i < dur.size(); ++i)
v.push_back(oo(dur[i], i, user[i]));
sort(v.begin(), v.end());
int n = v.size();
memset(sum, , sizeof(sum));
memset(P, , sizeof(P));
int m = ;
sum[] = v[].val;
P[] = ;
for (int i = ; i < n; ++i){
if (v[i].usr != v[i-].usr) m++;
sum[m] += v[i].val;
P[i] = m;
}
last[m] = n - ;
memset(S, , sizeof(S));
for (int i = ; i <= m; ++i)
for (int j = ; j <= m; ++j)
if (sum[i] == sum[j]) S[i]++;
vector<double> ans(n);
for (int i = ; i < n; ++i){
double ssum = ;
for (int j = ; j <= m; ++j)
if (sum[P[i]] > sum[j]) ssum += sum[j];
double tmp = (S[P[i]] - 1.0) / 2.0 * sum[P[i]];
tmp += 0.5 * (sum[P[i]] - v[i].val) + v[i].val;
ans[v[i].id] = tmp + ssum;
}
return ans;
}
};

最新文章

  1. Microsoft Visual Stduio 2005 Ent安装报错解决方法
  2. 重写ScrollView 解决ScrollView嵌套viewpager事件冲突
  3. ThinkPHP 学习笔记 ( 四 ) 数据库操作之关联模型 ( RelationMondel ) 和高级模型 ( AdvModel )
  4. Servlet三种实现方法(四)
  5. java方法签名
  6. 自动化运维工具之ansible
  7. openwrt的uboot环境变量分析
  8. Oracle用户的初始化问题
  9. [转载] Java中常用的加密方法
  10. SSMS 2005 连接 SQL SERVER 2008问题
  11. MySQL查询所有数据库表出错
  12. html表单通过关联数组向php后台传多条数据并遍历输出
  13. python 10
  14. 2017/05/04 java 基础 随笔
  15. C# 一些代码小结--UI操作
  16. 第10月第1天 iOS crash
  17. 跳转AppStore 评分
  18. Boost::lexical_cast类型转换
  19. [Erlang16]为什么要用MFA代替fun()–&gt;end?
  20. 修改Eclipse中项目在Apache Tomcat中的部署路径

热门文章

  1. IIS7.0上传在大小限制
  2. BZOJ 2594 水管局长 - LCT 维护链信息
  3. LibreOJ #6007. 「网络流 24 题」方格取数 最小割 最大点权独立集 最大流
  4. MySQL复制(Replication)
  5. jquery ajax 全局事件
  6. Bootstrap学习遇到的role属性--- 无障碍网页应用属性
  7. JS Async Callback
  8. 一道区间DP的水题 -- luogu P2858 [USACO06FEB]奶牛零食Treats for the Cows
  9. 从模板驱动文件ins生成cls文件
  10. lepus部署