Codeforces_807
A. 严格按照题目给的两个条件来。
#include<bits/stdc++.h>
using namespace std; int n,a[],b[]; int main()
{
ios::sync_with_stdio(false);
cin >> n;
for(int i = ;i <= n;i++) cin >> a[i] >> b[i];
int flag1 = ,flag2 = ;
for(int i = ;i <= n;i++)
{
if(a[i] != b[i]) flag1 = ;
}
for(int i = ;i < n;i++)
{
if(a[i] < a[i+]) flag2 = ;
}
if(flag1) cout << "rated" <<endl;
else if(flag2) cout << "unrated" << endl;
else cout << "maybe" << endl;
return ;
}
B.可能的值为xx = x+50k(xx >= y),从小到大枚举每一个可能的值,计算cnt就可以了。
#include<bits/stdc++.h>
using namespace std; int x,y,p,a[]; int main()
{
ios::sync_with_stdio(false);
cin >> p >> x >> y;
int xx = x;
while(x >= y)
{
int t = x/%;
for(int i = ;i <= ;i++)
{
t = (t*+)%;
a[i] = t+;
if(a[i] == p)
{
cout << << endl;
return ;
}
}
x -= ;
}
x = xx;
int cnt = ,now = ;
while()
{
int t = x/%;
for(int i = ;i <= ;i++)
{
t = (t*+)%;
a[i] = t+;
if(a[i] == p)
{
cout << cnt << endl;
return ;
}
}
x += ;
now++;
if(now == )
{
now = ;
cnt++;
}
}
return ;
}
C.先判断0和-1的情况,然后按大小分类。
若x/y < p/q,我们要把x/y变得尽量大,并且最后的值是p/q,可以变成(np-(y-x))/nq,计算n向上取整,然后结果为nq-y。
若x/y > p/q,我们要把x/y变得尽量小,即只加分母,不加分子,最后变成x/nq == np/nq,计算n向上取整,结果同上。
#include<bits/stdc++.h>
using namespace std; long long x,y,xx,yy; int main()
{
ios::sync_with_stdio(false);
int T;
cin >> T;
while(T--)
{
cin >> x >> y >> xx >> yy;
if(x*yy == y*xx)
{
cout << << endl;
continue;
}
if(x != && xx == || xx >= yy)
{
cout << - << endl;
continue;
}
if(x*yy < xx*y)
{
long long t = y-x;
long long ans = t/(yy-xx);
if(ans*yy-t < ans*xx) ans++;
cout << ans*yy-y << endl;
}
else
{
long long ans = x/xx;
if(ans*xx < x) ans++;
cout << ans*yy-y << endl;
}
}
return ;
}
还可以二分n值来写。
D.暴力枚举到100000就可以了。
#include<bits/stdc++.h>
using namespace std; int n,a[][],b[] = {},c[]; int calc(int x,int y,int z)
{
int t = -x;
if(x == -) return ;
if(*y > z) return *t;
if(*y > z) return *t;
if(*y > z) return *t;
if(*y > z) return *t;
if(*y > z) return *t;
return *t;
} bool ok(int x)
{
int sum1 = ,sum2 = ;
for(int i = ;i <= ;i++) c[i] = b[i];
for(int i = ;i <= ;i++)
{
if(a[][i] != - && a[][i] > a[][i]) c[i] += x;
}
for(int i = ;i <= ;i++)
{
sum1 += calc(a[][i],c[i],n+x);
sum2 += calc(a[][i],c[i],n+x);
}
return sum1 > sum2;
}
int main()
{
ios::sync_with_stdio(false);
cin >> n;
for(int i = ;i <= n;i++)
{
for(int j = ;j <= ;j++)
{
cin >> a[i][j];
if(a[i][j] >= ) b[j]++;
}
}
for(int i = ;i <= ;i++)
{
if(ok(i))
{
cout << i << endl;
return ;
}
}
cout << - << endl;
return ;
}
E.分别对2的倍数,与2倍数间隔间的数计数,结果个数最多为1的个数,对每个个数,我们判断其是否可行。
我们贪心当前2的倍数之后一个的2的倍数,使剩下来的2的倍数的数量和非2倍数数量和尽可能少,因为剩下的个数为最小的划分的数的个数。
#include<bits/stdc++.h>
using namespace std; int n,now = ,num[] = {},two[] = {},ans[]; bool ok(int x)
{
int t = two[]-x;
for(int i = ;i <= now;i++)
{
if(x >= two[i])
{
t -= min(x-two[i],t);
x = two[i];
}
else t += two[i]-x;
t += num[i];
}
if(t <= x) return ;
return ;
} int main()
{
ios::sync_with_stdio(false);
cin >> n;
long long t = ;
for(int i = ;i <= n;i++)
{
long long x;
cin >> x;
if(x == t) two[now]++;
else if(x < t) num[now-]++;
else
{
while(t < x)
{
t *= ;
now++;
}
if(x == t) two[now]++;
else num[now-]++;
}
}
int cnt = ;
for(int i = ;i <= two[];i++)
{
if(ok(i)) ans[++cnt] = i;
}
if(cnt == ) cout << - << endl;
else
{
for(int i = ;i <= cnt;i++) cout << ans[i] << " ";
cout << endl;
}
return ;
}
F.首先一种特殊情况,我们选择权值最小(w0)的一条边,设其两点为A,B,不难理解,A,B两点的总p值均为(n-1)*w0。
然后,对于其他的点,取点a,每个点连接着(n-1)条边,对于每条边,权值为w1,设它连的点为a,b,那么,我们可以把除a,b外的所有点先连成最小,即所有边最终跑向A或B,即(n-3)*w0,然后连接A到b或者B到b,再b到a,这里最后两条路径的权值分为两种情况:①若前一点->b 大于 b->a,则总p值为(n-3)*w0+2*w1
②若前一点->b 小于 b->a,则总p值为(n-3)*w0+w前一点->b+w1
这样的情况下,我们在(n-1)*2种情况里取的最小p值为最优解。
第一种情况比较好求解,第二种情况我们可以从到b点的最优转换而来,把原来的a去掉,在最后加上b->a,即-minn+w1。
这样我们就对求解顺序有一定的要求,按边权值从小到大排序,每次更新边的两个点,是符合要求的。
#include<bits/stdc++.h>
using namespace std; int n;
long long ans[];
struct xx
{
int u,v,w;
xx(int a,int b,int c):u(a),v(b),w(c){};
friend bool operator <(xx a,xx b)
{
return a.w < b.w;
}
}; vector<xx> v; int main()
{
ios::sync_with_stdio(false);
cin >> n;
for(int i = ;i <= n;i++) ans[i] = 1e18;
for(int i = ;i <= n;i++)
{
for(int j = i+;j <= n;j++)
{
int x;
cin >> x;
v.push_back(xx(i,j,x));
}
}
sort(v.begin(),v.end());
long long minn = v[].w;
for(int i = ;i < v.size();i++)
{
int x = v[i].u,y = v[i].v,w = v[i].w;
long long t = (long long)w*+minn*(n-);
ans[x] = min(ans[x],min(ans[y]-minn+w,t));
ans[y] = min(ans[y],min(ans[x]-minn+w,t));
}
for(int i = ;i <= n;i++) cout << ans[i] << endl;
return ;
}
Codeforces_807的更多相关文章
随机推荐
- 聊聊密码学中的DES算法
用心分享,共同成长 没有什么比你每天进步一点点更实在了 本文已经收录至我的github,欢迎大家踊跃star 和 issues. https://github.com/midou-tech/artic ...
- 为什么大家都说Java中只有值传递?
最近跟Java中的值传递和引用传递杠上了,一度怀疑人生.查了很多资料,加上自己的理解,终于搞清楚了,什么是值传递和引用传递.也搞明白了,为什么大家都说Java只有值传递,没有引用传递.原来,我一直以来 ...
- linux下安装OpenCV-2.4
OpenCV(Open Source Computer Vision Library),是一个跨平台计算机视觉库,实现了图像处理和计算机视觉方面的很多通用算法. OpenCV由一系列 C 函数和少量 ...
- Shell脚本实现DB2数据库表导出到文件
该Shell脚本用于实现将DB2数据库表导出到文件,将在另一篇博文<Java代码调用Shell脚本并传入参数实现DB2数据库表导出到文件>中通过Java代码实现调用该脚本并传入参数. #! ...
- Django之Session与Cookie
目录 一.cookie Cookie的由来 什么是Cookie Cookie的原理 查看Cookie cookie与session的作用 二.Django中操作Cookie 获取Cookie 设置Co ...
- Google 开源的 Python 命令行库:fire 实现 git 命令
作者:HelloGitHub-Prodesire HelloGitHub 的<讲解开源项目>系列,项目地址:https://github.com/HelloGitHub-Team/Arti ...
- 原生javascript实现选项卡(基础版)
一.实现原理 1.主要运用“排他思想”,在设置当前元素前,先把相应元素恢复到默认状态 2.给相应元素添加下标的应用 二.代码展示 <!DOCTYPE html> <html> ...
- ILSpy反编译工具之C#反汇编
1.下载ILspy工具 https://github.com/icsharpcode/ILSpy#ilspy------- 注意: ILspy需要在电脑上安装.NET Framework 4.0. ...
- Oracle索引大全
文档结构如下: 前言: Oracle 官方文档对索引的描述真是弱透了,对索引的说明就是一坨……,support也没有很好的资料,下面还是用的官方上的内容经过自己的整理加上网上的资料. 索引类型: 索引 ...
- APICloud开发者进阶之路 | UIPickerView 模块示例demo
本文出自APICloud官方论坛 rongCloud2 3.2.8 版本更新后添加了发送小视频接口,发送文件接口. rongCloud2 概述 融云是国内首家专业的即时通讯云服务提供商,专注为互联 ...