分析:贪心,当天只买之前所有天里面最便宜的。
#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;
}