https://vjudge.net/contest/352074#overview
#include
#include
#include
#include
#include
using namespace std;
int main()
{
int n,k,n1,a;
scanf("%d%d%d",&n,&k,&n1);
a=n/n1;
if(n%n1!=0)
{
a++;
}
a*=a;
if(k>=a)
{
printf("YES");
}
else
{
printf("NO");
}
return 0;
}
A题是水题,很多人是统计L和R的数量再+1求出的范围,但是lsr大佬还有更简便的方法如图:
B题是使最大子串的值要小于总值,当时这道题我脑子憨了一下,并没有做出来,但是赛后又是通过lsr大佬的帮助,明白了这道题:
比赛后补题,死活出不来,没想到最后卡我的是long long int QAQ。
#include
#include
#include
#include
using namespace std;
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
long long n,k=1,a[100005],sum=0,ans=0,ans1=0,ans2=0;
scanf("%lld",&n);
for(int i=1;i<=n;i++)
{
scanf("%lld",&a[i]);
sum+=a[i];
}
for(int i=1;i<=n;i++)
{
ans1+=a[i];
ans2+=a[n-i+1];
if(ans1<=0||ans2<=0)
{
k=0;
break;
}
}
if(k)printf("YES\n");
else printf("NO\n");
}
return 0;
}
C题理解了题目要求就直接模拟就好了。
#include
#include
#include
#include
using namespace std;
int main()
{
long long x,a,b;
scanf("%lld",&x);
a=sqrt(x);
while(1)
{
if(x%a==0)
{
if(__gcd(a,x/a)==1)
{
break;
}
}
a--;
}
printf("%lld %lld",a,x/a);
return 0;
}
D题是给一个数组,找出一个数X使得用X异或整个数组,所得的最大值最小(听上去很绕)。因为异或的性质,可以用二进制来操作,当数组中所有数的二进制形式,某一位都为1或者都为0,则可以忽略,而若0和1同时存在,该位上的1就无法避免,就可以分两种情况进行讨论从而分治,当取0是该位为0的可以忽略,只考虑该位为1的数就行,当为1时则反向操作。
会用到vector的有关知识请自行百度。
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
int dfs(int y,vector<int> &x)
{
vector<int>x0,x1;
if(y<=0)
return 0;
for(int o=0;o<x.size();o++)
{
int tt=x[o],ttt=x[o]^y;
if(ttt<tt)
x1.push_back(tt);
else
x0.push_back(tt);
}
if(x0.size()==0)
{
int m=dfs(y/2,x1);
return m;
}
if(x1.size()==0)
{
int m=dfs(y/2,x0);
return m;
}
int m0=dfs(y/2,x0),m1=dfs(y/2,x1);
int m=min(m0,m1)+y;
return m;
}
vector<int>v;
int main()
{
int ans,k=1,n,t;
vector<int>a;
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&t);
a.push_back(t);
while(k<t)
{
k*=2;
}
}
ans=dfs(k,a);
printf("%d",ans);
}
E题算是一道数学题,看懂公式之后,在用高中学过的基本不等式公式即可求出,基本不等式公式为下图:
#include
#include
#include
#include
#include
using namespace std;
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
double b,n,d,ans=0;
scanf("%lf%lf",&n,&d);
b=sqrt(d);
ans=2*b-1;
if(ans<=n) printf("YES\n");
else printf("NO\n");
}
return 0;
}
F题可用打表找规律得出,只有当b取9或99或999…即在十进制下再增加1可以进一位的数时,a取任何值都满足条件。
#include
#include
#include
#include
#include
using namespace std;
long long x[10]={0,9,99,999,9999,99999,999999,9999999,99999999,999999999};
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
long long a,b,k;
scanf("%lld%lld",&a,&b);
for(int i=0;i<=9;i++)
{
if(b>=x[i])
{
k=i;
}
}
printf("%lld\n",a*k);
}
return 0;
}
看懂题目,查看输入程序中是否含有’H’ ‘Q’ '9’这三个字符,有输出YES,否则NO
#include
#include
#include
#include
#include
using namespace std;
int main()
{
int l,k=0;
char a[200];
scanf("%s",a);
l=strlen(a);
for(int i=0;i<l;i++)
{
if(a[i]=='H'||a[i]=='Q'||a[i]=='9')
{
k++;
break;
}
}
if(k)printf("YES");
else printf("NO");
return 0;
}
H题的难点在于计算多边形各个角的角度,需要运用C++中的数学公式。