A. Polycarp and Coins
题目大意:
用n枚2元硬币和m枚一元硬币支付某个价格,要求n与m的差值尽量小,
题解:
总价格除以三,余下的部分用一个一元或两元硬币来支付。
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=2e5+5;
const int inf=0x3f3f3f3f;
int main()
{
int t;
cin>>t;
while(t--)
{
int n;
cin>>n;
int x=n/3;
int y=n%3;
int ans1=x,ans2=x;
if(y==2)
{
ans2++;
}else if(y==1)
{
ans1++;
}
cout<<ans1<<" "<<ans2;
cout<<endl;
}
return 0;
}
拼网速的题
B1 - Wonderful Coloring - 1
题目大意:
对字母进行着色,相同颜色中不能有相同字母,两种颜色的数目必须相等。
题解:
对出现次数不超过2的字母计数,最后除以二向下取整即可。
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=2e5+5;
const int inf=0x3f3f3f3f;
int main()
{
int t;
cin>>t;
while(t--)
{
map<char,int> mp;
string a;
cin>>a;
int ans=0;
for(int i=0;i<a.length();i++)
{
if(mp[a[i]]<=1)
{
mp[a[i]]++;
ans++;
}
}
cout<<ans/2<<endl;
}
return 0;
}
B2 - Wonderful Coloring - 2
题目大意:
对字母进行着色,与B1的差别是颜色种类数和要求输出每个位置的涂色方法
题解:
模拟,就硬模拟。
开vector储存每个字符的所有出现位置,同时记录当前应该涂什么颜色和已经涂了多少块,当剩余块数小于颜色总数时就不再涂了,因为这样无法做到所有颜色的出现次数相等。
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=2e5+5;
const int inf=0x3f3f3f3f;
struct xx{
vector<int> vec;
};
xx x[N];
int b[N];
int a[N];
int main()
{
int t;
cin>>t;
while(t--)
{
int n,k;
cin>>n>>k;
for(int i=1;i<=n;i++)
{
x[i].vec.clear();
}
for(int i=1;i<=n;i++)
{
b[i]=0;
}
for(int i=1;i<=n;i++)
{
cin>>a[i];
x[a[i]].vec.push_back(i);
}
int all=0;
for(int i=1;i<=n;i++)
{
if(x[i].vec.size()>k)
{
all+=k;
}else{
all+=x[i].vec.size();
}
}
int noned=all%k;
int need=all-noned;
int now=1;
int ued=0;
bool ok=0;
for(int i=1;i<=n;i++)
{
int hav=1;
for(int j=0;j<x[i].vec.size();j++)
{
b[x[i].vec[j]]=now;
ued++;
if(ued==need){
ok=1;
break;
}
now++;
if(now>k)
{
now=1;
}
hav++;
if(hav>k) break;
}
if(ok) break;
}
for(int i=1;i<=n;i++)
{
cout<<b[i]<<" ";
}
cout<<endl;
}
return 0;
}
动态二维数组真好用,STL岂是如此不便之物!
C. Interesting Story
题目大意:
N个字符串,只包含a到e五种字符,要求让其中一种大于其余四种的和,
结构体储存某个字母减去其余字母的数量,由五种字母的贡献分别对数组结构体排序,取最大即可。
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=2e5+5;
const int inf=0x3f3f3f3f;
struct alp{
string a;
int la,lb,lc,ld,le;
};
alp q[N];
bool cmpa(alp x,alp y)
{
return x.la>y.la;
}
bool cmpb(alp x,alp y)
{
return x.lb>y.lb;
}
bool cmpc(alp x,alp y)
{
return x.lc>y.lc;
}bool cmpd(alp x,alp y)
{
return x.ld>y.ld;
}
bool cmpe(alp x,alp y)
{
return x.le>y.le;
}
int main()
{
int t;
cin>>t;
while(t--)
{
int n;
cin>>n;
for(int i=1;i<=n;i++)
{
q[i].la=q[i].lb=q[i].lc=q[i].ld=q[i].le=0;
}
for(int i=1;i<=n;i++)
{
string s;
cin>>s;
q[i].a=s;
for(int j=0;j<s.length();j++)
{
if(s[j]=='a')
{
q[i].la++;
}else{
q[i].la--;
}
if(s[j]=='b')
{
q[i].lb++;
}else{
q[i].lb--;
}
if(s[j]=='c')
{
q[i].lc++;
}else{
q[i].lc--;
}
if(s[j]=='d')
{
q[i].ld++;
}else{
q[i].ld--;
}
if(s[j]=='e')
{
q[i].le++;
}else{
q[i].le--;
}
}
}
int ans=0;
int sum=0;
int count=0;
sort(q+1,q+1+n,cmpa);
for(int i=1;i<=n;i++)
{
sum+=q[i].la;
if(sum>0) count++;
else break;
}
ans=max(ans,count);
sum=0;
count=0;
sort(q+1,q+1+n,cmpb);
for(int i=1;i<=n;i++)
{
sum+=q[i].lb;
if(sum>0) count++;
else break;
}
ans=max(ans,count);
sum=0;
count=0;
sort(q+1,q+1+n,cmpc);
for(int i=1;i<=n;i++)
{
// if(sum<0) break;
sum+=q[i].lc;
if(sum>0) count++;
else break;
}
ans=max(ans,count);
sum=0;
count=0;
sort(q+1,q+1+n,cmpd);
for(int i=1;i<=n;i++)
{
// if(sum<0) break;
sum+=q[i].ld;
if(sum>0) count++;
else break;
}
ans=max(ans,count);
sum=0;
count=0;
sort(q+1,q+1+n,cmpe);
for(int i=1;i<=n;i++)
{
// if(sum<0) break;
sum+=q[i].le;
if(sum>0) count++;
else break;
}
ans=max(ans,count);
cout<<ans<<endl;
}
return 0;
}
给你五个字母你就写五遍一模一样的代码,那要是给你二十六个字母你是不是要写过五百多行?