C. Similar Pairs
题意:
两个数分一组,要求两数同奇偶或者差值小于等于1。若某组2n个数据可分为n组,输出YES,否则输出NO。
思路:
若有偶数个奇数,则可分组。(偶-偶=偶)YES
若有奇数个奇数,找到一对差值为1的奇偶凑成一组就可分组。YES
其它情况均为NO。
代码:
#include<bits/stdc++.h>
using namespace std;
int main(){
int t;
scanf("%d",&t);
while(t--)
{
int flag=0,n,cnt = 0,mid=100;//mid差值
scanf("%d",&n);
vector<int>s(n+1,0);
for(int i=1;i<n+1;i++)
{
scanf("%d",&s[i]);
}
sort(s.begin()+1,s.end());//排序,便于计算元素差值
for(int i=1;i<n+1;i++)
{
if(s[i]%2==0)
cnt++;//统计偶数的个数
}
if(cnt%2==0)
flag=1;//偶数个偶数
else//奇数个偶数
{
for(int i=n;i>1;i-=2)//计算相邻两项差值
{
if(s[i]-s[i-1]==1)
flag=1;
}
for(int i=n-1;i>2;i-=2)//挪一位计算邻两项差值
{
if(s[i]-s[i-1]==1)
flag=1;
}
}
if(flag==1)//输出本组结果
printf("YES\n");
else
printf("NO\n");
}
}
D. Buying Shovels
题意:
买镰刀,求出买最少次套餐的次数。
思路:
求n小于等于k的最大因数(即n%x==0&&x<=k),即可得到最少购买次数ans。
可以特判n<=k,ans=1的情况。
代码:
#include<bits/stdc++.h>
using namespace std;
const long long inf=0x3f3f3f3f;//无穷常数,配合min函数使用
int main(){
int t;
scanf("%d",&t);
while(t--)
{
long long n,k,ans=inf;
scanf("%lld %lld",&n,&k);
if(n>k)
{
for(long long i=1;i<=sqrt(n);i++)
{
if(n%i==0)
{
if(i<=k) ans=min(ans,n/i);
if(n/i<=k) ans=min(ans,i);
}
}
}
else
ans=1;
printf("%lld\n",ans);
}
}
关键点:
for(long long i=1;i<=sqrt(n);i++)
{
if(n%i==0)
{
if(i<=k) ans=min(ans,n/i);
if(n/i<=k) ans=min(ans,i);
}
}
求n的因数是从1遍历到(int)√n,当i为n的因数时,相应另一个因数也被确定,这样可以减少遍历1到n的时间,避免TLE。