链接:
第二十一届宁波大学程序设计竞赛(同步赛)_ACM/NOI/CSP/CCPC/ICPC算法编程高难度练习赛_牛客竞赛OJ (nowcoder.com)
A:直接输出 不多解释
B:
B-Love You Guys_第二十一届宁波大学程序设计竞赛(同步赛) (nowcoder.com)
#include<bits/stdc++.h>
using namespace std;
int x,y,a,b;
int main()
{
cin>>x>>y>>a>>b;
int cnt=a;
int num=0;
int X=x;
while(x>=0)
{
x-=cnt+num*b;
num++;
x+=y;
//cout<<x<<endl;
//if(x<0) break;
if(x>=X) x=X;
}
if(num!=0)cout<<num<<endl;
else cout<<1<<endl;
return 0;
}
注意 可能一开始就过挂科了 所以对num==0 特判一下;
D:
D-爱丽丝,来扫除啦!(Easy Version)_第二十一届宁波大学程序设计竞赛(同步赛) (nowcoder.com)
#include<bits/stdc++.h>
using namespace std;
int n;
map<double,int>mp;
map<double,int>mp2;
int a[10];
int main()
{
int mx=-1;
cin>>n;
int f=0;
while(n--)
{
double x,y;
cin>>x>>y;
if(x==0.0&&y==0.0)
{
f++;
continue;
}
else if(x==0.0)
{
if(y>0) a[0]++;
else a[1]++;
}
else if(y==0.0)
{
if(x>0) a[2]++;
else a[3]++;
}
else
{
double num=y/x;
if(x>0&&y>0||x<0&&y>0)
{
mp[num]++;
mx=max(mp[num],mx);
}
else
{
mp2[num]++;
mx=max(mp2[num],mx);
}
}
}
sort(a,a+4,greater<int>());
mx=max(mx,a[0]);
cout<<mx+f<<endl;
return 0;
}
射线经过的点集合可以根据斜率来合并点的集合,用map 来计数。
因为存在x==0或y==0的情况,所又用了a数组来存储。
题目数据比较细节,若出现(0,0)那么所有点是都可以经过的 所以mx++。
另外因为是射线,所以是要按区间分的。
F:
F-奇数Alice偶数Bob!_第二十一届宁波大学程序设计竞赛(同步赛) (nowcoder.com)
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int n;
int main()
{
cin>>n;
vector<int>a;
for(int i=0;i<n;i++)
{
int x;
cin>>x;
a.push_back(x);
}
if(n%2==1) cout<<"Yukimi"<<endl;
else{
sort(a.begin(),a.end());
int mn=a[0];
int cnt=n;
for(int i=1;i<n;i++)
{
if(a[i]!=mn) cnt++;
}
//cout<<cnt<<endl;
if(cnt%2==1) cout<<"Yukimi"<<endl;
else cout<<"LCF"<<endl;
}
return 0;
}
有点博弈的感觉,我还没怎么接触过这类题,好在这题比较好过。
首先分石头总的堆数,若是奇数就直接胜利。
什么?为什么?
其实要赢的话 就是维护石头非零堆数为偶数的过程(对手选的时候为偶数堆),一开始就是奇数的话 直接选任意一堆变为0 对手不得不跟着你把石堆变成0 最后一步必然是你选的,那么对手必输。
那偶数呢?一定会输吗? 不!会赢的!(可能)
由于先手是我方选择,那么就可以将其他非最小的石堆变成当前最小值,这样对手回合又是偶数堆了,但对手同样也可以这样干,就这样两方不断维护偶数石堆,但最小值必然会全部变成一样,这样双方就只能把石堆的数值变成0(反正最后肯定会变成0,省去过程了)
那这样就只要计数 看有多少次非最小的石堆供我方选择。
若为奇数,其实就是和石堆数为奇数时一样了,胜利!
若为偶数,很遗憾,失败 QWQ。
H:
H-后缀0_第二十一届宁波大学程序设计竞赛(同步赛) (nowcoder.com)
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main()
{
ll t;
cin>>t;
while(t--)
{
ll n;
cin>>n;
if(n<=3) cout<<0<<endl;
else
{
n=n-3+5-1;
ll cnt=0;
while(n)
{
cnt+=n/5;
n=n/5;
}
cout<<cnt<<endl;
}
}
return 0;
}
打表找规律 (如果你很强 通过数学方法 证明出来了 我承认,你很强 qwq)
1-3 为 0
之后每5一组
但要注意 每隔5^n那组数值都会多1 (最后写的时候猜出来的 毕竟要接近答案 哈哈)
其他题目还没写出来 有时间会补(应该)
看到这里了 点个赞吧 !
THE END