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

时间:2022-03-21 12:41:34

链接:https://www.nowcoder.com/acm/contest/67/A
来源:牛客网

心得:水水水!感觉自己水到爆!

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

思路:

水题一个,暴力枚举,一开始想的是贪心,一直在找贪的条件,浪费不少时间。

代码:

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <vector>
#include <cmath>
#include <queue>
#define ll long long
#define maxn 1000000
using namespace std;
struct Node{
    int p;
    int k;
}node[1005];
 
int a[1005][1005];
double g[1005];
int n,m;
int q;
double b;
int  main()
{
    ios::sync_with_stdio(false);
     
     
    while(cin>>n>>m){
    memset(g,0,sizeof(g));
    for(int i=1;i<=n;i++){
        cin>>node[i].p>>node[i].k;
        for(int j=1; j<=node[i].k; j++)
         cin>>a[i][j];
    }
    for(int k=1;k<=m;k++){
        cin>>q>>b;
        g[q]=max(g[q],b); //其实同一类型,只保留最大的那个概率即可。
    }
    double ans;
    ans=-1;
    double sum=1;
    for(int i=1;i<=n;i++){  //枚举一遍,找最大值!
        sum=1;
        for(int j=1;j<=node[i].k;j++){
             sum+=g[a[i][j]];
        }
        ans=max(ans,node[i].p*(sum));
    }
    printf("%.4lf\n",ans);
}
    return 0;
}

B 最强的决斗者一切都是必然的!

思路:模拟一遍,读懂题意,一段一段的截,然后一段一段的求

代码:

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <vector>
#include <cmath>
#include <queue>
#define ll long long
#define maxn 1000
using namespace std;
 
struct Node{
    int s;
    int t;
    int num;
}node[1005];
int n;
 
ll func(int l,int r){
    ll ans=r-l+1;
    ll sum=0;
    for(int i=r; i>=l; i--){
        if(node[i].t==1){
            sum+=node[i].num;
            ans--;
        }
        else if(node[i].t==2){
            sum+=ans*node[i].num;
            ans--;
        }
        else if(node[i].t==3){
            break;
        }
        else if(node[i].t==4){
            i--;
            ans=ans-2;
        }
    }
    return sum;
}
char s[100];
int main(){
    while(cin>>n){
    getchar();
    for(int i=1;i<=n;i++){
        gets(s);
        int len=strlen(s);
        int a=0,b=0,c=0;
        ll sum=0;
        for(int j=0;j<len;j++){
            if(sum==0){
                if(s[j]==' ') sum++;
                else a=a*10+s[j]-'0';
            }
            else if(sum==1){
                if(s[j]==' ') sum++;
                else b=b*10+s[j]-'0';
            }
            else if(sum==2){
                if(s[j]==' ') break;
                else c=c*10+s[j]-'0';
            }
             
        }
        node[i].s=a;
        node[i].t=b;
        node[i].num=c;
    }
    int l,r;
    ll sum1=0;
    ll ans=0;
    l=1;
    for(int i=2;i<=n;i++){
        if(node[i].s>=node[i-1].s)
        sum1++;
        else if(node[i].s<node[i-1].s){
            ans+=func(l,l+sum1);
        //  cout<<l<<" "<<l+sum<<"-----"<<endl;
            sum1=0;
            l=i;
        }
    }
//  cout<<l<<"   "<<l+sum<<endl;
    ans+=func(l,l+sum1);
    cout<<ans<<endl;
  }
  return 0;
}

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

思路:找到血量的临界值,6*a到7*a之间时,就要使用血包了,然后在判断血包的数量。

代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long int ll;
const int N=1000+10;
int main()
{
    int t,a,b,c,num;
    scanf("%d",&t);
    while(t--)
    {
        num=100;
        scanf("%d%d%d",&a,&b,&c);
        int less=6*a;
        while(num>0&&b>0)
        {
            if(num>less&&num<=less+a&&c>0)
            {
                num=80;
                c--;
            }
            b--;
            if(b<=0)
            break;
            num-=a;
        }
        if(num>0&&b<=0)
            printf("YES\n");
        else
            printf("NO\n");
    }
    return 0;
}

H 方块与收纳盒 

思路:递推!dp[i]=dp[i-1]+dp[i-2];

代码:

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <vector>
#include <cmath>
#include <queue>
#define ll long long
#define maxn 1000000
using namespace std;
ll dp[85];
int main(){
    int T;
    int n;
    cin>>T;
    dp[1]=1;
    dp[2]=2;
    dp[3]=3;
    for(int i=4;i<=80;i++)
     dp[i]=dp[i-1]+dp[i-2];
      
    while(T--){
        cin>>n;
        cout<<dp[n]<<endl; 
    }
    return 0;
}

I 找数字个数

思路:模拟一遍,一个一个找

代码:

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <vector>
#include <cmath>
#include <queue>
#define ll long long
#define maxn 1000
using namespace std;
int a,b;
bool vis[16];
void q(int x){
    int tem;
    while(x!=0){
        tem=x%10;
        vis[tem]=1;
        x/=10;
    }  
}
bool check(int x){
    int tem;
    if(x%a==0||x%b==0) return false;
    while(x!=0){
        tem=x%10;
        if(vis[tem]==1){
            return false;
        }
        x=x/10;
    }
    return true;
}
int main(){
    int t;
    cin>>t;
    while(t--){
        memset(vis,0,sizeof(vis));
        cin>>a>>b;
        q(a);
        q(b);
        int sum=0;
        for(int i=0;i<=1000;i++){
            if(check(i)){
                sum++;
            }
        }
        cout<<sum<<endl;
         
    }
     
}