Codeforces Round #461

本文解析了几道算法挑战题目,包括玩具复制问题、三数异或为0的组合计数、模运算唯一性验证、字符串排列优化及背包问题。通过具体实例展示了如何运用不同算法策略解决问题。

没事做一下。
A:给定一个初始的玩具,有两种机器,①投入这个玩具,可以额外生成以个玩具和一个复制品(原来的玩具不会消失),②投入一个复制品,生成额外的两个复制品(原来的复制品也不会消失)
给你最后的玩具数目和复制品数目,问你最后能否生成。
思路:这种题还是要想明白再写,不然wa个好几发整的也挺尴尬的。

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int main()
{    ll m,n;
     cin>>m>>n;
     if(n==1&&m==0){
        puts("YES");//特殊情况
     }
     else if(n>1&&(m-n+1)>=0&&(m-n+1)%2==0){
        puts("YES");//玩具一定要大于1.
     }
     else
        puts("NO");
    return 0;
}

B:三个数在[1,n]之间,且三者异或为0.问着三个数有多少种。
数据范围很小暴力

#include <bits/stdc++.h>
using namespace std;
map<pair<int,pair<int,int> >,bool >mp;
int main()
{   ios::sync_with_stdio(false);
    int m;
    cin>>m;
    int ans=0;
    //mp.clear();
    for(int i=1;i<=m;i++){
        for(int j=i;j<=m;j++){
            int s=i^j;
            if(s>=1&&s<=m){
                if(i+j>s&&i+s>j&&j+s>i){
                    //cout<<i<<" "<<j<<" "<<s<<endl;
                    ans++;
                }
            }
        }
    }
    cout<<ans/3<<endl;
    return 0;
}

c 给定1-n个数,求每个数m%i的结果是否都不一样。
数据范围 1e18
思路:没有写,毕竟是1e18啊。。 后来看别人的代码,直接暴力就过。。
设想 i为1, 结果比为0
为2 结果必为 0 或者1(而如果是0就break了)。
为3 结果可为 0 1 2 (是0,1就break)
所以这题就是说有很高的概率break。实际上限应该非常低非常低。 。
n modi 就是n%i ,我开始还整反了。。

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll m,n;
map<ll,bool>mp;
int main()
{   scanf("%lld%lld",&m,&n);
    bool flag=false;
    for(int i=1;i<=n&&!flag;i++){
        ll s=m%i;
        if(mp[s])flag=true;
        mp[s]=true;
    }
    puts(flag?"No":"YES");
    return 0;
}

D:给你n个串由 s和h组成,问你如何排列他们能使 sh子序列最多,输出这个数目。
思路:贪心,按s的比例。。这个我也没想到。

#include <bits/stdc++.h>
using namespace std;
/*

*/
const int maxn=1e5+5;
typedef long long ll;
struct Node{
     string s;
     double bl;
}nod[maxn];
bool cmp2(Node a,Node b){
     return a.bl>b.bl;
}
int main()
{   ios::sync_with_stdio(false);
    int m;
    while(cin>>m){
         ll ans=0;
         for(int i=0;i<m;i++){
             cin>>nod[i].s;
             int num=0;
             for(int j=0;j<nod[i].s.length();j++){
                 if(nod[i].s[j]=='s') num++;
                 else ans++;
             }
             int len=nod[i].s.length();
             nod[i].bl=(1.0*num)/(1.0*len);
         }
         sort(nod,nod+m,cmp2);
         ll sum=0;
         //cout<<ans<<"!!"<<endl;
         for(int i=0;i<m;i++){
             for(int j=0;j<nod[i].s.length();j++){
                 if(nod[i].s[j]=='s'){sum+=ans;
                // cout<<i<<" "<<nod[i].s<<endl;
                 }
                 else ans--;
             }
         }
         printf("%lld\n",sum);
     }


    return 0;
}

E是个 背包。等等再写。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值