2018年全国多校算法寒假训练营练习比赛(第一场)

时间:2023-01-26 00:19:24

A题。

暴力枚举就行了。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <map>
#include <vector>
using namespace std;
const int maxn=1005;
int p[maxn];
int n,m;
double mp[maxn];
int main()
{
while(~scanf("%d%d",&n,&m))
{
vector<int> v[maxn];
int x,s;
for(int i=1;i<=n;i++)
{
scanf("%d",&x);
p[i]=x;
scanf("%d",&x);
for(int j=1;j<=x;j++)
{
scanf("%d",&s);
v[i].push_back(s);
}
}
double w;
memset(mp,0,sizeof(mp));
for(int i=1;i<=m;i++)
{
scanf("%d%lf",&x,&w);
if(w>mp[x])
mp[x]=w;
}
double maxx=0;
double shi;
for(int i=1;i<=n;i++)
{
shi=p[i];
int len=v[i].size();
double k=1;
for(int j=0;j<len;j++)
{
k+=mp[v[i][j]];
}
shi=shi*k;
if(shi>maxx)
{
maxx=shi;
}
}
printf("%.4lf\n",maxx);
}
return 0;
}
F题。

模拟一下这个过程,急救包应该是在血量比较低但是能救活的情况下用。这个范围是6*a<sum<=7*a。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;

int main()
{
int t,a,b,c;
scanf("%d",&t);
while(t--)
{
scanf("%d%d%d",&a,&b,&c);
int sum=100;
int ju=b;
while(sum>0)
{
if(6*a<sum&&7*a>=sum)
{
if(c>0)
{
sum=80;
c--;
}
else
{
ju--;
sum-=a;
}
}
else
{
ju--;
sum-=a;
}
if(ju<=1)
break;
}
if(sum>0)
printf("YES\n");
else
printf("NO\n");
}
return 0;
}

H题。

一开始想到的是用递归写一下,结果直接超时,然后想到了离散里的指数生成函数,结果推出来2^(n-1)样例都不能过。最后突然想到这其实就是一个斐波那契数列呀,f(n)=f(n-1)+f(n-2),这样递推出来就行了。

#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
typedef long long ll;
ll a[85];
int main()
{
a[1]=1;
a[2]=2;
for(int i=3;i<=80;i++)
{
a[i]=a[i-1]+a[i-2];
}
int t,n;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
printf("%lld\n",a[n]);
}
return 0;
}

I题。

这题根据题意把所有的1-1000有关a和b包含的数以及a和b的数刨去就行了。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <map>
using namespace std;

int main()
{
int a,b,t,shu[1005];
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&a,&b);
map<int,int>mp;
int num=a;
while(num>0)
{
int x=num%10;
mp[x]=1;
num=num/10;
}
num=b;
while(num>0)
{
int x=num%10;
mp[x]=1;
num=num/10;
}
memset(shu,0,sizeof(shu));
int cnt=0;
for(int i=1;i<=1000;i++)
{
int num=i;
if(num%a==0||num%b==0)
shu[i]=1;
else
{
while(num>0)
{
int x=num%10;
if(mp[x]==1)
{
shu[i]=1;
break;
}
num=num/10;
}
}
if(shu[i]==0) cnt++;
}
printf("%d\n",cnt);
}
return 0;
}

第一次做这种比赛,还是经验不够呀。