A. Middle of the Contest
题意
给两个时间,问中间时刻
解析
简单模拟
ac:
#include<bits/stdc++.h>
using namespace std;
int main()
{
int a,b,c,d;
scanf("%d:%d",&a,&b);
scanf("%d:%d",&c,&d);
int aa=a*60+b;
int bb=c*60+d;
int cc=(aa+bb)/2;
printf("%02d:%02d",cc/60,cc%60);
return 0;
}
B. Preparation for International Women's Day
题意:
给n个数,和一个k, 1<=d[i]<=1e9
问能取出多少对数的和是k的倍数
解析:
(a+b)%k==0 => a%k+b%k==0,每个数对k取余标记累加
如果n为偶数,要处理(取余是n/2)的情况,还要加上(取余是0)的情况
ac:
#include<bits/stdc++.h>
#define MAXN 200005
#define ll long long
using namespace std;
int a[MAXN]={0};
int main()
{
ll n,k,x;
scanf("%I64d%I64d",&n,&k);
for(int i=0;i<n;i++)
{
scanf("%I64d",&x);
a[x%k]++;
}
ll sum=0;
for(int i=1,j=k-i;i<j;i++,j--)
sum+=min(a[i],a[k-i]);
if(k%2==0)
sum+=a[k/2]/2;
sum+=a[0]/2;
printf("%I64d\n",sum*2);
return 0;
}
C. Balanced Team
题意:
给n个数,问最多可以找到多少个数他们的极差不答应5
解析:
排序后二分查找大5的数的位置,遍历比较出最大的
ac:
#include<bits/stdc++.h>
#define ZERO 1e-6
#define ll long long
#define MAXN 200005
using namespace std;
int a[MAXN]={0};
int b[MAXN]={0};
int main()
{
int n,x;
scanf("%d",&n);
for(int i=0;i<n;i++)
{
scanf("%d",&x);
a[i]=b[i]=x;
}
sort(a,a+n);
sort(b,b+n);
int c=unique(b,b+n)-b;
int maxs=0;
for(int i=0;i<c;i++)
{
int g=lower_bound(a,a+n,b[i])-a;
int t=upper_bound(a,a+n,b[i]+5)-a;
maxs=max(maxs,t-g);
}
printf("%d\n",maxs);
return 0;
}
D. Zero Quantity Maximization
题意:
给n个ai,n个bi
自己选择d, 使0=d*ai+bi 的个数最多(d是实数范围) ( -1e9 <= ai,bi <= 1e9 )
d=-bi/ai,找最多的di,但不好直接除
ai = ai/gcd(ai,bi), bi = bi/gcd(ai,bi) 比较两个同时相等的个数
注意几个特殊情况
ai==0&&bi==0,d随便什么都可以,另外累计
ai==0&&bi!=0,d无论如何都不能使等式为0,continue;
ac:
#include<bits/stdc++.h>
#define MAXN 200005
#define ll long long
using namespace std;
ll gcd(ll a,ll b)
{
return b==0?a:gcd(b,a%b);
}
int n;
struct node
{
ll a,b;
}e[MAXN];
bool cmp(node x,node y)
{
if(x.a*x.b==y.a*y.b)
return x.a<y.a;
else return x.a*x.b<y.a*y.b;
}
int main()
{
int n;
ll x,y;
scanf("%d",&n);
for(int i=0;i<n;i++)
scanf("%I64d",&e[i].a);
for(int i=0;i<n;i++)
scanf("%I64d",&e[i].b);
ll cnt=0;
ll q=0,j=0;
for(int i=0;i<n;i++)
{
if(e[i].a==0&&e[i].b==0)
{
cnt++;
continue;
}
if(e[i].a==0&&e[i].b!=0)
continue;
ll t=gcd(e[i].a,e[i].b);
e[j].a=e[i].a/t;
e[j].b=e[i].b/t;
j++;
}
sort(e,e+j,cmp);
if(j>0)
{
ll maxs=1;
ll ans=1;
for(int i=1;i<j;i++)
{
if(e[i].a==e[i-1].a&&e[i].b==e[i-1].b)
ans++;
else{
ans=1;
}
maxs=max(ans,maxs);
}
printf("%I64d\n",maxs+cnt);
}
else printf("%I64d\n",cnt);
return 0;
}
F1. Spanning Tree with Maximum Degree
题意
给你n nn个点m mm条边的无向联通图,找出一棵生成树,使度最大的点的度最大。
1≤n,m≤105 1 \leq n,m \leq 10^51≤n,m≤10
5
解析:
度最大的点一定是原图度最大的点,记录度数,从度最大的点开始遍历生成树
ac:
#include<bits/stdc++.h>
#define MAXN 200005
using namespace std;
typedef pair <int, int> pii;
vector<int> mp[MAXN];
vector<pii> ans;
int in[MAXN]={0};
int vis[MAXN];
void bfs(int st)
{
vis[st]=1;
queue<int> que;
que.push(st);
while(!que.empty())
{
int u=que.front();
que.pop();
for(int i=0;i<mp[u].size();i++)
{
int v=mp[u][i];
if(vis[v]==0)
{
vis[v]=1;
que.push(v);
ans.push_back(pii(u,v));
}
}
}
}
int main()
{
int n,m,u,v;
scanf("%d%d",&n,&m);
memset(vis,0,sizeof(vis));
for(int i=1;i<=m;i++)
{
scanf("%d%d",&u,&v);
mp[u].push_back(v);
mp[v].push_back(u);
in[u]++;
in[v]++;
}
int maxs=0,st;
for(int i=1;i<=n;i++)
{
if(in[i]>maxs)
{
maxs=in[i];
st=i;
}
}
bfs(st);
for(int i=0;i<ans.size();i++)
printf("%d %d\n",ans[i].first,ans[i].second);
return 0;
}