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


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;
 }


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值