Educational Codeforces Round 122 (Rated for Div. 2) A-D

大水场,除夕夜有点迷糊,大好的上分机会错过了。。。
A. Div. 7
更改给定的数字把它变成7的倍数,改变最少个数字并将它输出,如果本身就是7的倍数直接输出。
太莽了,上去就贡献罚时。如果不是7的倍数直接改变个位数字就行,但是要判断,不管是减去7的余数还是先加7在减余数,都不能动下一个数字。

#include <bits/stdc++.h>
#define endl '\n'
using namespace std;
typedef long long ll;

int main()
{
   ios::sync_with_stdio(0);
   int t,n,i,j;
   cin>>t;
   while(t--)
   {
       cin>>n;
       if(n%7==0) {cout<<n<<endl;continue;}
       else{
         int k=n%7;
         int u=n%10;
         if(u-k<0) n=n+7-k;
         if(u-k>=0) n=n-k;
         cout<<n<<endl;
         continue;
       }
   }
}

B. Minority
给定一个字符串(其中只包含0和1),截取其中一个子串,将其中0和1中比较少的数字删去,输出最多能删去的数量。
直接取整个字符串就行了,如果0和1的个数相等那答案就-1。

#include <bits/stdc++.h>
#define endl '\n'
using namespace std;
typedef long long ll;

int main()
{
   ios::sync_with_stdio(0);
   int t,n,i,j;
   cin>>t;
   while(t--)
   {
       string s;
       cin>>s;
       map<int,int>a;
       int ans=0;
       for(i=0;i<s.size();i++)
       {
           a[s[i]-'0']++;
           ans=min(a[0],a[1]);
       }
       if(a[0]==a[1]) ans=ans-1;
       cout<<ans<<endl;
   }
}

C. Kill the Monster
Monocarp要杀怪兽,给出主人公的生命值和攻击力、怪物的生命值和攻击力。Monocarp有k枚硬币,每枚硬币可以提高w攻击力或者a生命值,主人公先动手,如果能先杀死怪兽则输出yes,反之则no。
麻烦题做多了,贪了半天心,结果就是个暴力,暴力举出所有硬币方案,只要能杀死怪兽则直接yes,如果所有方案都杀不死怪兽那么就是no。

#include <bits/stdc++.h>
#define endl '\n'
using namespace std;
typedef long long ll;

int main()
{
   ios::sync_with_stdio(0);
   ll t,n,i,j;
   cin>>t;
   while(t--)
   {
       ll hc,dc,hm,dm,k,a,w;
       cin>>hc>>dc>>hm>>dm;
       cin>>k>>w>>a;
       int f=0;
       for(i=0;i<=k;i++)
       {
           hc=hc+i*a;
           dc=dc+w*(k-i);
           ll wo=hm/dc;
           if(hm%dc>0) wo=wo+1;
           ll ta=hc/dm;
           if(hc%dm>0) ta=ta+1;
           if(wo<=ta) {f=1;break;}
           hc=hc-i*a;   //把生命值和攻击力变回去
           dc=dc-w*(k-i);
       }
       if(f==1) cout<<"YES"<<endl;
       if(f==0) cout<<"NO"<<endl;
   }
}

D. Make Them Equal
给出n种硬币和k次改变,每种硬币有bi的代价和ci的价值。ai固定为1,每次执行1次改变可以使ai变成ai+ai/x(x为任意整数)每次将ai变成bi可以得到ci的钱,输出用k次改变可以得到最多的ci。
BFS+背包dp,bi只有1000的范围。记录一下路径,用BFS打出bi范围的表,然后直接用滚动数组优化的01背包去进行硬币问题的操作。唯一要注意的是打出bi的表发现最大就是12,也就是说如果改变次数是硬币数量的12倍以上就可以直接取到所有的硬币,跳过就行,如果不加这个判断条件很有可能会超时。

#include <bits/stdc++.h>
#define endl '\n'
using namespace std;
typedef long long ll;
int a[10000];
ll dp[12010];
ll t,n,k;
void bfs(int u)
{
    queue<int>q;
    q.push(u);
    while(q.size()>0)
    {
        int start=q.front();
        q.pop();
        for(int i=1;i<=start;i++)
        {
            if(a[start+start/i]==0||a[start+start/i]>a[start]+1)
            {
                a[start+start/i]=a[start]+1;
                if(start+start/i<=1000)
                q.push(start+start/i);
            }
        }
    }
}
void solve()
{
    for(int i=1;i<=1000;i++)
    {
        cout<<a[i]<<endl;
    }
}
int main()
{
   ios_base::sync_with_stdio(false);
   cin.tie(NULL);
   bfs(1);
   // solve();
   int i,j;
   cin>>t;
   while(t--)
   {
      cin>>n>>k;
      vector<int>b(n),c(n);
      ll ans=0;
      for(i=0;i<n;i++)
      {
          cin>>b[i];
          b[i]=a[b[i]];
      }
      for(i=0;i<n;i++)
      {
          cin>>c[i];
          ans=ans+c[i];
      }
      memset(dp,0,sizeof(dp));
      if(k>=12*n)
      {
          cout<<ans<<endl;continue;
      }
      for(i=0;i<n;i++)
      {
          for(j=k;j>=b[i];j--)
          {
              dp[j]=max(dp[j],dp[j-b[i]]+c[i]);
          }
      }
      cout<<dp[k]<<endl;
   }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值