Codeforces Round #582 (Div. 3)

链接:http://codeforces.com/contest/1213

A. Chips Moving
题意:向右向左+2,-2免费,+1,-1花费为1,求多少花费才能使全部数字相同

代码:

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<vector>
#include<stack> 
#include<cstring>
#include<map>
#include<queue> 
#include<cmath>
#include<set> 
#define INF 0x3f3f3f3f
#define lowbit(a) ((a)&-(a))
#define speed std::ios::sync_with_stdio(false),cin.tie(NULL),cout.tie(NULL)
using namespace std;
typedef long long ll;
queue<int> q;
stack<int> s;
priority_queue<int> pq;  
const int maxn = 100005;
ll n,m,l,r;
ll ans=0;
ll a[maxn]; 
int main()
{
 cin>>n;
 for(ll i=1;i<=n;i++){
  cin>>a[i];
 }
 sort(a+1,a+1+n);
 for(ll i=2;i<=n;i++){
  a[i]=a[i]-a[1];
  a[i]%=2;
 }
 for(ll i=2;i<=n;i++){
  ans+=a[i];
 }
 cout<<min(ans,n-ans)<<endl; //最后记得比较哪个变哪个花费少
} 

B. Bad Prices(栈运用)

题意:ai后是否有数字比ai小,记录个数有这样的ai的个数。

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<vector>
#include<stack> 
#include<cstring>
#include<map>
#include<queue> 
#include<cmath>
#include<set> 
#define INF 0x3f3f3f3f
#define lowbit(a) ((a)&-(a))
#define speed std::ios::sync_with_stdio(false),cin.tie(NULL),cout.tie(NULL)
using namespace std;
typedef long long ll;
queue<int> q;
stack<int> s;
priority_queue<int> pq;  
const int maxn = 150005;
ll n,m,l,r;
ll ans=0;
ll a[maxn]; 
int main()
{
 ll T;
 cin>>T;
 while(T--){
  while(!s.empty())
   s.pop();
  ans=0;
  cin>>n;
  cin>>a[1];
  s.push(a[1]);
  for(ll i=2;i<=n;i++){
   cin>>a[i];
   while(!s.empty()){
    if(a[i]<s.top()){
     s.pop();
     ans++;
    }
    else
     break;
   }
   s.push(a[i]);
  }
  cout<<ans<<endl;
 }
} 

C. Book Reading

题意:m的倍数的最后一位的总和。我比较垃圾所以用暴搜,当然这也不失为一种方法。

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<vector>
#include<stack> 
#include<cstring>
#include<map>
#include<queue> 
#include<cmath>
#include<set> 
#define INF 0x3f3f3f3f
#define lowbit(a) ((a)&-(a))
#define speed std::ios::sync_with_stdio(false),cin.tie(NULL),cout.tie(NULL)
using namespace std;
typedef long long ll;
queue<int> q;
stack<int> s;
priority_queue<int> pq;  
const int maxn = 100005;
ll n,m,l,r;
ll ans=0;
ll a[]={1,2,3,4,5,6,7,8,9,0}; 
ll b[]={2,4,6,8,0};
ll c[]={3,6,9,2,5,8,1,4,7,0};
ll d[]={4,8,2,6,0};
ll e[]={5,0};
ll f[]={6,2,8,4,0};
ll g[]={7,4,1,8,5,2,9,6,3,0};
ll h[]={8,6,4,2,0};
ll j[]={9,8,7,6,5,4,3,2,1,0};
int main()
{
 ll t;
 cin>>t;
 while(t--){
  ans=0;
  cin>>n>>m;
  ll item=n/m;
  if(item==0){
   cout<<"0\n";
   continue;
  }
  m%=10;
  if(m==1){
   ans=(item/10)*45;
   for(ll i=0;i<item%10;i++){
    ans+=a[i];
   }
  }
  else if(m==2){
   ans=(item/5)*20;
   for(ll i=0;i<item%5;i++){
    ans+=b[i];
   }
  }
  else if(m==3){
   ans=(item/10)*45;
   for(ll i=0;i<item%10;i++){
    ans+=c[i];
   }
  }
  else if(m==4){
   ans=(item/5)*20;
   for(ll i=0;i<item%5;i++){
    ans+=d[i];
   }
  }
  else if(m==5){
   ans=(item/2)*5;
   for(ll i=0;i<item%2;i++){
    ans+=e[i];
   }
  }
  else if(m==6){
   ans=(item/5)*20;
   for(ll i=0;i<item%5;i++){
    ans+=f[i];
   }
  }
  else if(m==7){
   ans=(item/10)*45;
   for(ll i=0;i<item%10;i++){
    ans+=g[i];
   }
  }
  else if(m==8){
   ans=(item/5)*20;
   for(ll i=0;i<item%5;i++){
    ans+=h[i];
   }
  }
  else if(m==9){
   ans=(item/10)*45;
   for(ll i=0;i<item%10;i++){
    ans+=j[i];
   }
  }
  else if(m==0){
   cout<<"0\n";
   continue;
  }
  cout<<ans<<endl;
 }
} 

D1.D2Equalizing by Division

题意:将数字除以二为一次操作,问最少需要多少操作能使数列中有m个数字相同。

原来想二分,结果找不到思路,看了别人的代码感觉真的很吊。

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<vector>
#include<stack> 
#include<cstring>
#include<map>
#include<queue> 
#include<cmath>
#include<set> 
#define INF 0x3f3f3f3f
#define lowbit(a) ((a)&-(a))
#define speed std::ios::sync_with_stdio(false),cin.tie(NULL),cout.tie(NULL)
using namespace std;
typedef long long ll;
queue<int> q;
stack<int> s;
priority_queue<int> pq;  
const int maxn = 2e6+10;
ll n,m,l,r;
ll ans=0;
ll a[maxn]; 
vector<ll> v[maxn];
int main()
{
 cin>>n>>m;
 for(ll i=1;i<=n;i++){
  ll x;
  cin>>x;
  ll cnt=0;
  while(x){
   v[x].push_back(cnt++); //记录到每个阶段所需的花费 
   x/=2;
  }
 } 
 ans=INF;
 for(ll i=1;i<=maxn;i++){
  if(v[i].size()<m) continue; //到这个数字的个数没有超过要求则跳过 
  ll tans=0;
  sort(v[i].begin(),v[i].end());
  for(ll j=0;j<m;j++){
   tans+=v[i][j]; //总和总花费 
  }
  ans=min(ans,tans); //比较总花费 
 }
 cout<<ans<<endl;
} 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值