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. js精简写倒计时函数

    <div class="fRight mR10" id="time"> </div> <script type="tex ...

  2. 【Unity3d】3d网页游戏场景打包与加载

    http://www.cnblogs.com/dosomething/archive/2012/04/07/2436353.html 3d游戏中  一个场景往往比较大  如果游戏的进行需要下载一个10 ...

  3. word20161225

    Waiting for Call / 等待呼叫 wallpaper / 墙纸 WAN, wide area network / 广域网 warning level / 警告级别 Web folder ...

  4. jeecg bootstrap修改单列模版

    在作者原来的模版上增强单列模版 <%@ page language="java" import="java.util.*" contentType=&qu ...

  5. C++11智能指针读书笔记;

    智能指针是一个类对象,而非一个指针对象. 原始指针:通过new建立的*指针 智能指针:通过智能指针关键字(unique_ptr, shared_ptr ,weak_ptr)建立的指针 它的一种通用实现 ...

  6. ServiceStack.Redis订阅发布服务的调用(Z)

      1.Redis订阅发布介绍Redis订阅发布是一种消息通信模式:发布者(publisher)发送消息,订阅者(Subscriber)接受消息.类似于设计模式中的观察者模式.发布者和订阅者之间使用频 ...

  7. windows系统版本号

    windows操作系统版本号 操作系统 版本号 Windows8.1 6.3 Windows8 6.2 Windows7 6.1 Windows Server 2008 R2 6.1 Windows ...

  8. CISCO VLAN ACL

    对于cisco VLAN ACL 首先得定义 standard ACL或 extented ACL用于抓取流量 注意这里的抓取流量不是最终的对流量的操作,而是决定什么样的流量用VLAN ACL 来处理 ...

  9. c/c++的Soap应用

    1. 关于soap 在许多项目中团队中,我们常常会听到这样的话:我们这里是用webservice交互的.而说话的场景往往就是交互对象双方比较异构,所谓异构.即双方是不同的开发语言.不同的运行环境等.比 ...

  10. Js中 md5 sha1 base64 加密

    js的3中加密方式: .sha1加密,加密性高 调用: var sha = hex_sha1(str); .base64加密 调用: var b = new Base64(); var str = b ...