概述
http://codeforces.com/contest/344
//-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
B 344B Simple Molecules
题意:给出三个点的度数,求出三个点之间各有几条边。不能构成图输出impossible
题解:
解法一:贪心。每次选度最大的两个点连边。
解法二:知道所有点的度,由握手定理得知所有的边数,那么bc之间的边数=总边数-a的度。
比赛的时候只想出了解法一。
#include <algorithm>
#include <iostream>
#include <cstring>
#include <vector>
#include <cstdio>
#include <string>
#include <cmath>
#include <queue>
#include <set>
#include <map>
using namespace std;
typedef long long ll;
#define de(x) cout << #x << "=" << x << endl
int main() {
int a,b,c;
while(~scanf("%d%d%d",&a,&b,&c)) {
int ab=0,bc=0,ca=0;
int flag=0;
for(;;) {
if(a==0&&b==0) {
flag=1;
break;
}
if(b==0&&c==0) {
flag=1;
break;
}
if(c==0&&a==0) {
flag=1;
break;
}
if(a<=b&&a<=c) {
--b;
--c;
++bc;
} else if(b<=a&&b<=c) {
--a;
--c;
++ca;
} else {
--a;
--b;
++ab;
}
if(a+b+c==0) {
break;
}
}
if(flag) {
puts("Impossible");
} else {
printf("%d %d %dn",ab,bc,ca);
}
}
return 0;
}
//-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
E
343C
Read Time
题意:有n个针头,m个待读取的磁盘,给出针头和磁盘在坐标轴的位置,求针头的最大值最小。
题意:有n个针头,m个待读取的磁盘,给出针头和磁盘在坐标轴的位置,求针头的最大值最小。
题解:二分ans。check的写法见代码。
#include <algorithm>
#include <iostream>
#include <cstring>
#include <vector>
#include <cstdio>
#include <string>
#include <cmath>
#include <queue>
#include <set>
#include <map>
using namespace std;
typedef long long ll;
#define de(x) cout << #x << "=" << x << endl
const int N=100005;
ll a[N],b[N],vis[N];
int n,m;
bool check(ll dis) {
int p=1;
for(int i=1;i<=n&&p<=m;++i) {
ll t=a[i];
if(b[p]<a[i]) {
if(dis<a[i]-b[p]) return 0;
ll t1=a[i]+dis-2*(a[i]-b[p]);
ll t2=a[i]+(dis-(a[i]-b[p]))/2;
t=max(t1,t2);
} else {
t+=dis;
}
while(p<=m&&b[p]<=t) ++p;
}
return p>m;
}
int main() {
while(~scanf("%d%d",&n,&m)) {
for(int i=1;i<=n;++i) scanf("%I64d",&a[i]);
for(int i=1;i<=m;++i) scanf("%I64d",&b[i]);
ll l=0,r=20000000005,ans=-1;
while(l<=r) {
ll mid=l+r>>1;
if(check(mid)) {
r=mid-1;
ans=mid;
} else {
l=mid+1;
}
}
printf("%I64dn",ans);
}
return 0;
}
最后
以上就是时尚冥王星为你收集整理的codeforces contest 344的全部内容,希望文章能够帮你解决codeforces contest 344所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复