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,不会