Codeforces Round #326 (Div. 2)

A - Duff and Meat

分析:贪心,当天只买之前所有天里面最便宜的。

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
#include <string>
#include <vector>
#include <stack>
#include <bitset>
#include <cstdlib>
#include <cmath>
#include <set>
#include <list>
#include <deque>
#include <map>
#include <queue>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const double PI = acos(-1.0);
const double eps = 1e-6;
const int INF = 1000000000;
const int maxn = 100000 + 5;
int T,n,m;

int a[maxn], p[maxn];


int main() {
    m = INF;
    int ans = 0;
    cin >> n ;
    for(int i = 0 ; i < n ; i ++) {
        cin >> a[i] >> p[i];
        if(m > p[i]) m = p[i];
        else p[i] = m;
        ans += a[i]*p[i];
    }
    cout << ans << endl;
    return 0;
}
B - Duff in Love

分析:对一个数进行质因数分解,再把它的质因数单个撑起来就是答案。

如何求质因数:把1e6之内的所有素数用线性筛打表,用普通的求素数方式会爆时间,再用素数表去除n,就可以求出所有的质因数,为了防止n本身就是很大的素数而爆时间,最开始和除完一个质因数之后进行一次素数检测。

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
#include <string>
#include <vector>
#include <stack>
#include <bitset>
#include <cstdlib>
#include <cmath>
#include <set>
#include <list>
#include <deque>
#include <map>
#include <queue>
using namespace std;
typedef long long LL;
typedef unsigned long long ull;
const double PI = acos(-1.0);
const double eps = 1e-6;
const int INF = 1000000000;
const int MaxNum = 1e6 + 2;
LL n, m, k, ans;
bool isPrime[MaxNum] ; //数组定义该数字是否为素数
int prime[ MaxNum ] ; // 存下素数
int total = 0 ; //第几个素数

bool _prime(LL a) {
    for(int i = 0 ; i < total&&prime[i]*prime[i] <= a ; i ++)
        if(a%prime[i] == 0) return false;
    return true;
}

void seive( int Max  )
{
    memset( isPrime , true , sizeof( isPrime ));
    memset( prime , 0 , sizeof( prime ));
    isPrime[0 ] = false ;
    isPrime[1] = false ;
    for ( int i = 2 ; i <= Max ; i++ )
    {
        if ( isPrime[i] )
            prime[ total ++ ] = i ;
        for ( int j = 0 ; j < total && i * prime[j] <= Max ; j++)
        {
            isPrime[ i * prime[j] ] = false ;
            if (!( i % prime[j])) break;
        }
    }
}
int main() {
    k = 1;ans = 1;
   // pri[0] = 2;
   // for(int i = 3 ; i*i <= 1e8 ; i ++)
   //     if(prime(i)) pri[k++] = i;
    seive(MaxNum);
    cin >> n;
    for(int i = 0 ; i < total&&prime[i] <= n ; i ++) {
        if(i == 0&&_prime(n)) {
            ans *= n;
            break;
        }
        if(n%prime[i] == 0) {
            ans *= prime[i];
            while(n%prime[i] == 0) n /= prime[i];
            if(_prime(n)) {
                ans *= n;
                break;
            }
        }
    }
    cout << ans << endl;
    return 0;
}
C - Duff and Weight Lifting

分析:两个i可以变成一个i+1,要想次数最少,尽量让所有小的数和比它大的数一起相加,从而消去更多的数。所以从0开始不断的往大的加就行了。

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
#include <string>
#include <vector>
#include <stack>
#include <bitset>
#include <cstdlib>
#include <cmath>
#include <set>
#include <list>
#include <deque>
#include <map>
#include <queue>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const double PI = acos(-1.0);
const double eps = 1e-6;
const int INF = 1000000000;
const int maxn = 1000000 + 105;
int T,n,m;
int w[maxn], a[maxn];



int main() {
    ios::sync_with_stdio(false);
    cin.tie(0);
    int ans = 0;
    memset( a, 0, sizeof(a));
    cin >> n ;
    for(int i = 0 ; i < n ; i ++) {
        cin >> w[i];
        a[w[i]] ++;
    }
    for(int i = 0 ; i <= 1000100 ; i ++) {
        a[i+1] += a[i]/2;
        ans += a[i]%2;
    }
    cout << ans << endl;
    return 0;
}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值