链接: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;
}