Codeforces Round #340 (Div. 2)
2016-01-27 11:34
417 查看
A. Elephant
题意:
给定数x,从1.2.3.4.5中选择最少个数的数使最终和为x。分析:
由于每个数字使用次数不限,所以每次都用5填充,若不能正好填满,剩下的余数再在1-4中选择。代码:
#include<iostream> const int maxn=250; const int INF=0xfffffff; using namespace std; int main (void) { int a; cin>>a; int r=a/5; if(a%5==0) cout<<r; else cout<<r+1; return 0; }
B. Chocolate
题意:
给定一序列01串,对他们进行划分,使得划分后的每一块都只有一个1,求有多少种划分方法分析:
对于两个1中间夹着若干0的情况,可以在每个0后面进行一次划分,一个0对应一种划分方式对于以若干个0开头或结尾,只有一头有1的序列,这些0都要和这个1划分在一块中
对于整个序列只有0的情况,划分方式为0
对于整个序列只有1的情况,每个1都要划分为一块,即唯一一种划分方式
代码
#include<iostream> const int maxn=150; const int INF=0xfffffff; using namespace std; int a[maxn]; int main (void) { int n; cin>>n; long long result = 1; int p = 1; int flag = 0; for(int i = 0; i < n; i++) { cin>>a[i]; if(a[i] == 1) {result *= p; p = 1; flag = 1;} else if(flag == 1) p++; } if(flag == 0) cout<<0; else cout<<result; return 0; }
C. Watering Flowers
题意:
给定两个圆心坐标,求两个圆的半径,使得满足所有点至少在一个圆中,且半径平方和最小分析:
从距离第一个圆心最远的点开始,依次使第一个圆不包含该点,而第二个圆包含,求出每次对应的平方和,直到第二个圆包含所有点,遍历所有最佳可能情况,求出平方和最小值代码:
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> const int maxn=2005; const int INF=0xfffffff; using namespace std; struct flower { long long d1; long long d2; }d[maxn]; bool cmp(flower a,flower b) { if(a.d1 == b.d1) return a.d2<b.d2; else return a.d1<b.d1; } int main (void) { int n; long long x, y, x1,x2,y1,y2; scanf("%d%I64d%I64d%I64d%I64d",&n,&x1,&y1,&x2,&y2); for(int i = 1; i <= n; i++) { scanf("%I64d%I64d",&x,&y); d[i].d1=(x-x1)*(x-x1)+(y-y1)*(y-y1); d[i].d2=(x-x2)*(x-x2)+(y-y2)*(y-y2); } sort(d+1,d+n+1,cmp); d[0].d1 = 0; long long temp = 0; long long result = d .d1; for(int i = n-1; i >= 0; i--){ temp = max(temp,d[i+1].d2); result = min(d[i].d1+temp,result); // cout<<result<<'='<<temp<<'+'<<d[i].d1<<endl; } printf("%I64d\n",result); return 0; }
D. Polyline
题意:
给定三个点坐标,计算用与坐标轴平行的线段将其连接起来的最少线段数,(在一条直线的两个线段算做一条线段)分析:
三个点横或纵坐标相同,答案为1有两个点横或纵坐标相同,需对该三个点的纵或横坐标的关系进行判断
三个点横纵坐标均不同,判断是否在一条直线上
代码:
#include <iostream> #include <cstdio> #include <cmath> #include <algorithm> using namespace std; const int INF = 0x3fffffff, maxn = 5; long long x[maxn],y[maxn]; long long ma[maxn],mi[maxn],mj[maxn],mk[maxn]; long long maxl = -1e10, minl =1e10,maxy = -1e10, miny = 1e10; long long midx,midy; int result; int main (void) { for(int i = 0; i < 3; i++) { scanf("%I64d%I64d",&x[i],&y[i]); maxl=max(maxl,x[i]); minl=min(minl,x[i]); maxy=max(maxy,y[i]); miny=min(miny,y[i]); } int k = 0, j = 0, a = 0, b = 0; for(int i = 0;i < 3; i++){ if(x[i]==maxl) ma[k++]=y[i]; else if(x[i]==minl) mi[j++]=y[i]; else {midx=x[i];midy=y[i];} if(y[i]==maxy) mj[a++]=x[i]; else if(y[i]==miny) mk[b++]=x[i]; } sort(ma,ma+k); sort(mi,mi+j); sort(mk,mk+b); sort(mj,mj+a); if(k == 3||a == 3) result = 1; else if(k == 2){ if(ma[0]<mi[0]&&ma[1]>mi[0]) result=3; else result=2; } else if(j == 2){ if(ma[0]>mi[0]&&ma[0]<mi[1]) result=3; else result=2; } else if(a == 2){ if(mj[0]<mk[0]&&mj[1]>mk[0]) result=3; else result=2; } else if(b == 2){ if(mj[0]>mk[0]&&mj[0]<mk[1]) result=3; else result=2; } else if((double)(midy-ma[0])/(midx-maxl)==(double)(ma[0]-mi[0])/(maxl-minl)) result = 1; else result = 3; printf("%d\n",result); return 0; }
相关文章推荐
- Codeforces Round #197 (Div. 2)
- Codeforces Round #198 (Div. 1)
- Codeforces 405E Codeforces Round #238 (Div. 2)E
- Codeforces 407C Codeforces Round #239 (Div. 1)C
- CodeForces 449A - Jzzhu and Chocolate
- CodeForces 449 B. Jzzhu and Cities
- Codeforces Round #265 (Div. 2)
- Codeforces #310 div2 C. Case of Matryoshkas
- 状态压缩DP codeforces 244 Problem C. The Brand New Function 和 codeforces 165 E. Compatible Numbers
- codeforces 16 Problem E fish
- Codeforces Round332 部分题解
- CodeForces 603A_Alternative Thinking (DP)
- CodeForces 602B_Approximating a Constant Range_DP
- Codeforces round #247 for Div. 2
- Codeforces Round #246 (Div. 2)
- Codeforces #264(div 2)D.Gargari and Permutations
- Codeforces Round #236 (Div. 2)------A,B
- codeforces 257 div2 B
- Codeforces Gym100571A Cursed Query
- Codeforces Gym100342E Minima