毒瘤场,题都挺变态的。一小时ac前三题(时间全花在读题上了),然后罚坐(这次的D实在太恶心人了,补题也不想补了。。。)
A. Hard Way
几何题,题目很长很吓人,其实不难。给出三角形的三个顶点,问三角形的三条边上的点是否可以和y=0连成一条直线,这条直线不能穿过三角形内部。问三角形的边上存在这样一条直线的点的总长度是多少。
样例的小数点是唬人的,答案就是整数。只有当一条边和y=0平行并且这条边对应的角在下面这种情况这条边没有直线,除此之外所有情况全有直线。
#include#define endl 'n' #define INF 2147483647 using namespace std; typedef long long ll; const int N=200001; const int mod=1e9+7; ll a[N],b[N]; int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); int t,n,i,j; cin>>t; while(t--) { ll x1,x2,x3,y1,y2,y3; cin>>x1>>y1; cin>>x2>>y2; cin>>x3>>y3; ll ans=0; if(y1==y2&&y1!=0&&y1>y3) ans=ans+abs(x2-x1); if(y1==y3&&y1!=0&&y1>y2) ans=ans+abs(x3-x1); if(y3==y2&&y2!=0&&y3>y1) ans=ans+abs(x3-x2); cout< B. Power Walking
这道题的题目我读了二十分钟才发现漏看了个单词,这算这场比赛最大的失误了。
给出一个长度为n的数组,输出将这n个数字全部分配给k个孩子(k的大小为1-n)得到的这k个孩子不同的ai数量的和的最小值。
贪心+map判重,贪心策略就是尽量把不重复的数字分出去,把重复的数字留给同一个孩子。这样就可以保证这个孩子的不重复数字最小,也就是所有孩子的和的最小。#include#define endl 'n' #define INF 2147483647 using namespace std; typedef long long ll; const int N=300001; const int mod=1e9+7; ll a[N],b[N]; int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); int t,n,i,j; cin>>t; while(t--) { cin>>n; map c; ll ans=0; for(i=1;i<=n;i++) { cin>>a[i]; if(c[a[i]]==0) { ans++; c[a[i]]++; } else c[a[i]]++; } cout< ans) cout< C. Great Sequence
给出大小为n的数组和倍数x,如果数组中的两个数字满足倍数x的关系那么就可以把他们组合到一起。如果数组中的一个数字在数组中找不到满足x的关系了,就要添一个数字给它组合起来,输出最少要添多少个数字才能把数组中的所有数字组合在一起。
sort+map判重,先sort一下让数组有序防止它乱组合而达不到最优的情况。然后遍历判重看看有多少需要添数字的,尽量用除法,听说乘法好多爆int被fst的,还好不关我事。。。#include#define endl 'n' #define INF 2147483647 using namespace std; typedef long long ll; const int N=200001; const int mod=1e9+7; ll a[N],b[N]; int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); int t,n,i,j; cin>>t; while(t--) { int x; cin>>n>>x; map c; ll sum=n; ll ans=0; for(i=1;i<=n;i++) { cin>>a[i]; } sort(a+1,a+n+1); for(i=1;i<=n;i++) { if(sum==0) break; if(a[i]%x==0) { int u=a[i]/x; if(c[u]>0) { c[u]--; sum=sum-2; continue; } else c[a[i]]++; } if(a[i]%x!=0) c[a[i]]++; } cout< .
.
最近状态慢慢回来了,希望下次也能继续上分,快变色了(祈祷)
还有四级今天出分了,考的还不错,希望没过的同学们下次能有个好运气



