A - Jzzhu and Children

找到最大的ceil(ai/m)即可

#include <iostream>
#include <cmath>
using namespace std; int main(){
int n,m;
cin >> n >> m;
double a, maxv = ;
int maxIdx = ;
for(int i = ; i < n; ++ i){
cin >> a;
if(maxv <= ceil(a/m)){
maxv = ceil(a/m);
maxIdx = i+;
}
}
cout<<maxIdx<<endl; }

B - Jzzhu and Sequences

f= fi-1-fi-2

f1=x, f2=y, f3=y-x, f4 = y-x-y = -x, f5 = -x-(y-x) = -y , f6 =-y-(-x) = x-y

f7 = x-y-(-y)=x, f8 = x-(x-y) = y...........

注意该序列的循环节是6

只要算出前六个数即可。

#include <iostream>
#include <vector>
#define ll long long
#define MOD 1000000007
using namespace std; int main(){
ll x,y,n;
cin >> x >> y >> n;
vector<ll> f(,);
f[] =x;f[]=y;
for(int i = ; i < ; ++ i) f[i] = f[i-]-f[i-];
cout<<(f[(n-)%]%MOD+MOD)%MOD<<endl;
}

利用循环节

本题也可以采用矩阵快速幂运算

#include <iostream>
#include <vector>
#include <algorithm>
#include <string>
#include <queue>
#include <utility>
#define ll long long
#define MOD 1000000007
using namespace std; struct matrix
{
ll m[][];
}ans, base; matrix multi(matrix a, matrix b)
{
matrix tmp;
for(int i = ; i < ; ++i)
{
for(int j = ; j < ; ++j)
{
tmp.m[i][j] = ;
for(int k = ; k < ; ++k)
tmp.m[i][j] = (tmp.m[i][j] + a.m[i][k] * b.m[k][j]);
}
}
return tmp;
}
ll fast_mod(ll n,ll x,ll y)
{
base.m[][] = ;
base.m[][] = -;
base.m[][] = ;
base.m[][] = ;
ans.m[][] = ans.m[][] = ;
ans.m[][] = ans.m[][] = ;
while(n)
{
if(n & )
{
ans = multi(ans, base);
}
base = multi(base, base);
n >>= ;
} return ans.m[][]*y+ans.m[][]*x;
} int main(){
ll x,y,n;
cin >> x >> y >> n;
ll res = ;
if(n == ) res = x;
else if(n == ) res = y;
else res = fast_mod(n-,x,y);
if(res < ) res = res%MOD;
cout<<(res+MOD)%MOD<<endl;
}

矩阵快速幂运算

注意结果输出时对负数要 (res%mod+mod)%mod,因为res可能大于mod, 不然结果可能被cha掉

C - Jzzhu and Chocolate

题目的意思:

  给nxm的巧克力,切k刀后,求最小块巧克力的最大面积

解题思路:

  可以假设n<m,如果n>m,则交换n和m。

  现在将行分成x行,列分成y列,相当于行切x-1次,列切y-1次,x-1+y-1=k 即x+y=k-2,

  此时最小块面积是floor(n/x)*floor(m/y),要使最小块面积最大,即使x*y尽量小。

  x*y=x(k-2-x) = -x2+(k-2)x,这是一个开头向下的抛物线,抛物线中间值最大,要是值x*y最小,x必须在抛物线的两边,x在0这边或者k这边。

  现在分情况考虑

  (1)如果k<n,这最优的(x,y),是{x=1,y=k+1}(列切k次)或者{x=k+1, y=1}(行切k次)

  (2)如果n≤k<m,这最优的(x,y),是{x=1,y=k+1}(列切k次)

  (3)如果m≤k≤n+m-2,最优的(x,y),是{x=k+2-m,y=m}(行切k+1-m次,列切m次)

  (4) 如果 k>n+m-2,则不存在切割方法(行最多切n-1次,列最多切m-1次)

#include <iostream>
#include <vector>
#include <algorithm>
#include <string>
#define ll long long
using namespace std; int main(){
ll n,m,k;
cin >> n >> m >>k;
if(n > m) swap(n,m);
if(k < n) cout<<max(n*(m/(k+)),n/(k+)*m)<<endl;
else if(k>=n && k < m) cout<<n*(m/(k+))<<endl;
else if(k>=m && k <= n+m-) cout<<n/(k+-m)<<endl;
else cout<<-<<endl;
}

D - Jzzhu and Cities

题目的意思:

  给你n个城市,m条无向有权边,然后还有k条边,每条边是从起点出发到i,以及相应的权重,删除这k条边中的一些边,使每个点到起点的最短距离不变。

解题思路是:

  将原有的m条边和k条边都加入图中,注意要区分这两种不同的边,对于k条边是可以删除的,要进行标记。然后跑一遍dijkstra算法,记录其每个点最短路径的前一个点。然后遍历这些点,如果前一个点是起始点,且当前点到前一个点是可以删除边,则这条边不可以删除。

  关于dijkstra算法,可以参考《算法竞赛入门经典训练指南》p327给的模板,这本书上面有很多模板写的比较好

#include <iostream>
#include <vector>
#include <algorithm>
#include <queue>
#include <cstring>
#include <cstdlib>
#define ll long long
#define INF 0xffffffff
#define maxn 100000
using namespace std; struct Edge{
int from,to;
ll dist;
bool flag;
}; struct HeapNode{
ll d;
int u;
bool operator<(const HeapNode& rhs) const{
return d > rhs.d;
}
}; struct Dijkstra{
int n,m;
vector<Edge> edges;
vector<int> G[maxn];
bool done[maxn];
ll d[maxn];
int p[maxn]; void init(int n){
this->n = n;
for(int i = ; i < n ; ++ i) G[i].clear();
edges.clear();
} void AddEdge(int from, int to, int dist,bool flag = false){
edges.push_back((Edge){from,to,dist,flag});
m = edges.size();
G[from].push_back(m-);
} void dijkstra(int s){
priority_queue<HeapNode> Q;
for(int i = ; i < n; ++ i ) d[i] = INF;
d[s] = ;
memset(done,,sizeof(done));
Q.push((HeapNode){,s});
while(!Q.empty()){
HeapNode x = Q.top();Q.pop();
int u = x.u;
if(done[u]) continue;
done[u] = true;
for(int i = ; i < G[u].size(); ++ i){
Edge& e = edges[G[u][i]];
if(d[e.to] > d[u] + e.dist || (d[e.to] == d[u] + e.dist && !e.flag)){
d[e.to] = d[u] + e.dist;
p[e.to] = G[u][i];
Q.push((HeapNode){d[e.to], e.to});
}
}
}
}
}; int main(){
int n,m,k;
cin >> n >> m >> k;
Dijkstra a;
a.init(n);
for(int i = ; i < m; ++ i){
int u,v;
ll x;
cin >> u >> v >>x;
--u;--v;
a.AddEdge(u,v,x);
a.AddEdge(v,u,x);
}
for(int i = ; i < k; ++i){
int s;
ll y;
cin >>s >> y;
--s;
a.AddEdge(,s,y,true);
a.AddEdge(s,,y,true);
}
a.dijkstra();
int res = ;
for(int i = ; i < n; ++ i){
if(a.edges[a.p[i]].flag) res++;
}
cout<<k-res<<endl;
}

Dijkstra算法

E - Jzzhu and Apples

题目的意思:

  有1到n个数,它们两两分为一组,要求在一组的数字的公共因子大于1,即要求这两个数不互质,问最多有多少分组

解题思路:

  对于找出n以内的素数,由于n的最大为100000,可以考虑用筛选法选择素数。(其核心思想就是素数的倍数都不是素数)

  2是素数,则2*2,2*3........都不是素数,然后将这些数标记,下一个数是3

  3是素数,则3*2,3*3........都不是素数,然后将这些数标记,下一个数是5

  .........

  对于1和大于n/2的素数不可能满足要求,因为不可能存在一个在n内的数和大于n/2的素数有公因子

  只需要考虑2到n/2范围内的素数。这里可能有疑问,为什么不考虑2到n/2的非素数?可以想象把筛选法筛选素数的方法逆过来。

  假设i是2~n/2内的一个素数,那么2*i,3*i,4*i......(小于等于n),有公因子i,

    如果这些数的个数(包括i)为偶数的话,那么这些数两两组合即可

    否则为奇数的话,选择2*i(i的偶数倍都可以),留给2的倍数去考虑,然后其余的两两组合

#include <iostream>
#include <vector>
#include <algorithm>
#include <cstring>
#include <utility>
#define MAX (100000+5)
using namespace std; bool prime[MAX], visit[MAX];
void init(){
memset(prime,true,sizeof(prime));
memset(visit,false,sizeof(visit));
for(int i = ; i < MAX;++i){
if(prime[i]){
for(int j = i*;j < MAX; j+=i) prime[j] = false;
}
}
} int main(){
init();
int n;
cin >>n;
vector<pair<int,int> >res;
for(int i = n/; i>=; -- i){
if(prime[i]){
vector<int> divisor;
for(int j = i; j <= n; j+=i){
if(!visit[j]) divisor.push_back(j);
}
if(divisor.size()% != ){
for(int j = ; j < divisor.size(); ++ j){
if(divisor[j]% == ) {
swap(divisor[j],divisor.back());
divisor.pop_back();
break;
}
}
}
for(int j = ; j < divisor.size() ; j+=){
res.push_back(make_pair(divisor[j],divisor[j+]));
visit[divisor[j]] = true;
visit[divisor[j+]] = true;
}
}
}
cout<<res.size()<<endl;
for(int i = ; i < res.size(); ++i ) cout<<res[i].first<<" "<<res[i].second<<endl;
}

Codeforces Round #257 (Div. 2)的更多相关文章

  1. Codeforces Round #257 (Div. 1)A~C(DIV.2-C~E)题解

    今天老师(orz sansirowaltz)让我们做了很久之前的一场Codeforces Round #257 (Div. 1),这里给出A~C的题解,对应DIV2的C~E. A.Jzzhu and ...

  2. Codeforces Round #257 (Div. 1) C. Jzzhu and Apples (素数筛)

    题目链接:http://codeforces.com/problemset/problem/449/C 给你n个数,从1到n.然后从这些数中挑选出不互质的数对最多有多少对. 先是素数筛,显然2的倍数的 ...

  3. Codeforces Round #257 (Div. 2) B. Jzzhu and Sequences (矩阵快速幂)

    题目链接:http://codeforces.com/problemset/problem/450/B 题意很好懂,矩阵快速幂模版题. /* | 1, -1 | | fn | | 1, 0 | | f ...

  4. Codeforces Round #257 (Div. 1)449A - Jzzhu and Chocolate(贪婪、数学)

    主题链接:http://codeforces.com/problemset/problem/449/A ------------------------------------------------ ...

  5. Codeforces Round #257 (Div. 2) A. Jzzhu and Children(简单题)

    题目链接:http://codeforces.com/problemset/problem/450/A ------------------------------------------------ ...

  6. Codeforces Round #257(Div. 2) B. Jzzhu and Sequences(矩阵高速幂)

    题目链接:http://codeforces.com/problemset/problem/450/B B. Jzzhu and Sequences time limit per test 1 sec ...

  7. Codeforces Round #257(Div.2) D Jzzhu and Cities --SPFA

    题意:n个城市,中间有m条道路(双向),再给出k条铁路,铁路直接从点1到点v,现在要拆掉一些铁路,在保证不影响每个点的最短距离(距离1)不变的情况下,问最多能删除多少条铁路 分析:先求一次最短路,铁路 ...

  8. Codeforces Round #257 (Div. 2) B

    B. Jzzhu and Sequences time limit per test 1 second memory limit per test 256 megabytes input standa ...

  9. Codeforces Round #257 (Div. 2) A题

    A. Jzzhu and Children time limit per test 1 second memory limit per test 256 megabytes input standar ...

随机推荐

  1. web报表工具Stimulsoft Reports.Web在mvc项目中使用

    Stimulsoft Reports.Web,是一款可以直接在Web中编辑报表的报表工具 web项目技术框架mvc4+easyui+knockoutjs 1.在项目中添加引用 Stimulsoft.B ...

  2. 疯狂了!当游戏爱上MongoDB会怎么样???

    导读 前端时间魔兽这个电影我相信大家都看过了哈,作为一个码农,有时候我也会去思考魔兽世界这个游戏背后他的一些设计和实现,比如他用什么数据库.当然真正用什么数据库这个我是不确定的,我们今天的主题是当游戏 ...

  3. Sicily 1215: 脱离地牢(BFS)

    这道题按照题意直接BFS即可,主要要注意题意中的相遇是指两种情况:一种是同时到达同一格子,另一种是在移动时相遇,如Paris在(1,2),而Helen在(1,2),若下一步Paris到达(1,1),而 ...

  4. python , angular js 学习记录【3】

    1.Alembic是SQLAlchemy作者编写的Python数据库迁移工具.用它实现模型类和数据库的同步更新.(安装以及操作步骤 使用Alembic迁移数据库) 使用Alembic添加数据库字段操作 ...

  5. ArcGIS 10.1 BUG记录

    声明:笔者使用ARCGIS 10.1 XXX版,YYY版可能没有此处描写的问题 1. 关于注册数据库 发布启用FA的服务,需要为数据库进行ArcGIS Server注册,若通过ArcMap执行注册,会 ...

  6. shell 多行注释

    :<<! 要注释的内容 要注释的内容 要注释的内容 !

  7. svn上传工程之后下载,打开下载之后的工程缺少文件

    当我们把iOS的工程上传到SVN中,当我们再从SVN中下载下来,就会出现错误,这是什么原因呢?我这里出现的错误是找不到文件,后来知道原来是被屏蔽掉了,就是上传的时候不上传某个类型的文件.例如我出错就是 ...

  8. ShareSDK分享失败的原因

    关于分享估计很多都用的是ShareSDK的社会化分享,简单方便,支持的种类很多,但是一般的话都还是QQ,微信,新浪微博,腾讯微博为主. 最近需要导入一个分享的模块,失败了几次之后最终成功,分享给大家, ...

  9. asp.net Application、 Session、Cookie、ViewState、Cache、Hidden 的区别

    这些对象都是用来保存信息的,包括用户信息,传递值的信息,全局信息等等.他们之间的区别: 1.Application对象 Application用于保存所有用户的公共的数据信息,如果使用Applicat ...

  10. wifi的country code

    转自:http://userpage.chemie.fu-berlin.de/diverse/doc/ISO_3166.htmlCountry A 2 A 3 Number ------------- ...