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

时间:2022-04-16 11:34:48


A大吉大利,今晚吃鸡——枪械篇

 思路 : 首先,读题很重要,向我这种就是没认真读题导致卡了一个小时...

**每一把枪只能装备一个同类配件,那么在输入枪种类时把重复的处理掉。接下来就是枚举每把枪的最大威力

代码:

 #include <iostream>
#include <stdio.h>
#include <cmath>
#include <queue>
#include <map>
#include <list>
#include <set>
#include <cstring>
typedef long long ll;
using namespace std;
const int maxn = 1e6+5555;
double max_kind[1005];
int kind[1005][1005];
int use[1005];
int main(){
int n,m,k;
while(scanf("%d%d",&n,&m)!=EOF){
memset(max_kind,0,sizeof(max_kind));
int p,k,q,x,cnt;
double b;
for(int i=1;i<=n;i++){
scanf("%d%d",&p,&k);
cnt=1;
kind[i][0]=p;
memset(use,0,sizeof(use));
for(int j=1;j<=k;j++){
scanf("%d",&x);
if(!use[x]){
kind[i][cnt++]=x;
use[x]=1;
}
}
kind[i][1002]=cnt;
}
for(int i=1;i<=m;i++){
scanf("%d%lf",&q,&b);
if(max_kind[q]<b) max_kind[q]=b;
}
double ans=0,sum;
for(int i=1;i<=n;i++){
sum=1;
for(int j=1;j<kind[i][1002];j++){

sum+=max_kind[kind[i][j]];
}
//cout<<kind[i][0]<<endl;
ans = max(ans,kind[i][0]*sum);
//cout<<ans<<endl;
}
printf("%.4lf\n",ans);


}
return 0;
}


F   大吉大利,今晚吃鸡——跑毒篇

 思路:很简单,只要我们模拟就行,根据急救包加血凉是否能维持剩下的血量作为判断的进行模拟,

注意特判 a=0,b=0,c=0的情况 不然在循环里模拟逻辑不清楚会卡死循环,那个人就是我。。。(晕死)

代码:

 #include <iostream>
#include <stdio.h>
#include <cmath>
#include <queue>
#include <map>
#include <list>
#include <set>
#include <cstring>
typedef long long ll;
using namespace std;
const int maxn = 1e6+5555;
int prime[maxn];
bool is_prime[maxn];
int cnt = 0;
int main(){
int t;
scanf("%d",&t);
while(t--){
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
if(a==0||b==0) {
printf("YES\n");continue;
}
if(c==0){
if(a*(b-1)<100) printf("YES\n");
else printf("NO\n");
continue;
}
int jijiu = a*6;
int xueliang = 100;
int zou=0;
int pan = 0;
int deal = 0;
while(c){
int flag = 0;
int s = 0;
while(1)
{
int next = s+1;
int yanxu = xueliang-next*a;
if(yanxu<0) {
deal = 1;
break;
}
if(yanxu<=jijiu){
flag=1;
break;
}
s++;
}
if(deal) {
break;
}
if(flag){
xueliang = 80;
zou += s;
c--;
}
if(c==0){ //冲刺
int last = b-zou;
if((last-1)*a<xueliang)
{
pan=1;
}
break;
}

}
if(pan) printf("YES\n");
else printf("NO\n");
}
return 0;
}

H  方块与收纳盒

   思路 :手推出前5种,递推序列得 f[n]=f[n-1]+f[n-2] (n>=3) ps:是不是很熟悉

 

 #include <iostream>
#include <stdio.h>
#include <cmath>
#include <queue>
#include <map>
#include <list>
#include <set>
typedef long long ll;
using namespace std;
const int maxn = 1e6+5555;

ll f[100];
void init(){
f[1]=1;
f[2]=2;
for(int i=3;i<=100;i++){
f[i]=f[i-1]+f[i-2];
}
}
int main(){
init();
int t,n;
cin>>t;
while(t--){
cin>>n;
cout<<f[n]<<endl;
}
return 0;
}



找数字个数

思路:因为只需求1000以内,所以暴力枚举是否曼珠条件即可

 #include <iostream>
#include <stdio.h>
#include <cmath>
#include <queue>
#include <map>
#include <list>
#include <set>
typedef long long ll;
using namespace std;
const int maxn = 1e6+5555;

int a,b,count;
int wei[12];
void feijie(int a,int b){
count = 0;
while(a>=10){
int t = a%10;
a/=10;
wei[count++]=t;
}
wei[count++]=a;
while(b>=10){
int t = b%10;
b/=10;
wei[count++]=t;
}
wei[count++]=b;
}
bool bol(int num){
int flag=0;
while(num){
int t = num%10;
num/=10;
for(int i=0;i<count;i++){
if(wei[i]==t){
flag = 1;
break;
}
}
if(flag) break;
}
return flag;
}
int main(){
int T;
cin>>T;
while(T--){
cin>>a>>b;
int cnt = 0;
feijie(a,b);
for(int i=1;i<=1000;i++){
if(i%a==0||i%b==0||bol(i)) continue;
cnt++;
}
cout<<cnt<<endl;
}
return 0;
}