Codeforces Round #326 (div2)

1001.

题解:

Idea is a simple greedy, buy needed meat for i - th day when it's cheapest among days 1, 2, ..., n.

So, the pseudo code below will work:

ans = 0
price = infinity
for i = 1 to n
      price = min(price, p[i])
      ans += price * a[i]

Time complexity:

分析:感觉别人好有想法,贪心遍历一遍就有答案了,看到自己的代码怎一个蠢字了得!!

我的:

#include<bits/stdc++.h>
#define LL long long
using namespace std;
struct p
{
    int a,p,pos;
    bool vis=false;
}b[100003];
bool cmp(p a,p b)
{
    if(a.p==b.p)return a.pos<b.pos;
    return a.p<b.p;
}
int main()
{
    int n;
    LL ans=0;
    scanf("%d",&n);
    for(int i=0;i<n;i++){
        scanf("%d%d",&b[i].a,&b[i].p);
        b[i].pos=i;
    }
    sort(b,b+n,cmp);
    for(int i=0;i<n;i++){
        if(!b[i].vis){
            ans+=b[i].a*b[i].p;
            for(int j=i+1;j<n;j++){
                if(!b[j].vis&&b[j].pos>b[i].pos){
                    b[j].vis=true;
                    ans+=b[j].a*b[i].p;
                }
            }
        }
    }
    cout<<ans<<endl;
    return 0;
}

1002.

题解:

Find all prime divisors of n. Assume they are p1, p2, ..., pk (in ). If answer is a, then we know that for each 1 ≤ i ≤ k, obviously a is not divisible by pi2 (and all greater powers of pi). So a ≤ p1 × p2 × ... × pk. And we know that p1 × p2 × ... × pk is itself lovely. So,answer is p1 × p2 × ... × pk

Time complexity:

分析:跟我想的一样,求所有质因数相乘就是答案。

#include <bits/stdc++.h>
#define LL long long
using namespace std;
int main()
{
    LL n;
    cin>>n;
    LL ans=1;
    for(LL i=2;i*i<=n;i++){
        if(n%i==0){
            ans*=i;
            while(n%i==0)
                n/=i;
        }
    }
    if(n>1)ans*=n;
    cout<<ans<<endl;
    return 0;
}

1003.

题解:不知道题解在说什么鬼,这题只需要计算相同的数字个数,如果能凑够2个x,就相当于一个x+1,按照这一想法敲就好,

#include<bits/stdc++.h>
#define LL long long
using namespace std;
const int maxn=10000006;
int a[maxn];
int main()
{
   // ios::sync_with_stdio(false);
    int n,x;
    cin>>n;
    memset(a,0,sizeof(a));
    for(int i=0;i<n;i++){
        scanf("%d",&x);
        a[x]++;
    }
    int ans=0;
    for(int i=0;i<maxn;i++){
        if(a[i]){
            a[i+1]+=a[i]/2;
            a[i]%=2;
            if(a[i])
                ans++;
        }
    }
    cout<<ans<<endl;
    return 0;
}

1004.

分析:dp,不会

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值