您的位置:首页 > 其它

codeforces contest 344

2016-11-25 21:05 357 查看
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 %d\n",ab,bc,ca);
}
}
return 0;
}


//-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
E 343C Read
Time
题意:有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
,b
,vis
;
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("%I64d\n",ans);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: