开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 30 天,点击查看活动详情
Problem - 322B - Codeforces
有一种情况没有看出来看,不应该,3 5 5的答案应该是4,g和r单独做一个,然后再做上两个mixing的,特判一下这种情况就行:有两个取余为2,另一个取余为0
ll lcm(ll a,ll b){
return a*b/__gcd(a,b);
}
ll r,g,b;
int main(){
while(cin>>r>>g>>b){
// scanf("%lld%lld%lld",&r,&g,&b);
ll ans=min({r,g,b}),R=r-min({r,g,b}),G=g-min({r,g,b}),B=b-min({r,g,b});
ans+=R/3+G/3+B/3;
if(r%3==2&&g%3==2&&b%3==0&&b){
ans=max(ans,r/3+g/3+b/3+1);
}
else if(r%3==2&&b%3==2&&g%3==0&&g){
ans=max(ans,r/3+g/3+b/3+1);
}
else if(g%3==2&&b%3==2&&r%3==0&&r){
ans=max(ans,r/3+g/3+b/3+1);
}
R=r/3,G=g/3,B=b/3;
r=r%3,g=g%3,b=b%3;
ll res=R+G+B+min({r,g,b});
printf("%lld\n",max(res,ans));
}
system("pause");
return 0;
}
1481C - Fence Painting
如果c[m]是b中需要被修改的数,那么我们就让c[m]=v.back();如果不需要修改但是b中有c[m]那我们就找一个b的坐标作为c[m]的答案;如果b中没有c[m]的数,那么就是-1;
思路和题解差不多,但是细节没处理好,就是第一种情况没有贪心的让c[m]也去分配一个修改数的名额,改了这个之后就过了
CodeForces - 1481C - Fence Painting (贪心)_zzqwtc的博客-CSDN博客
ll lcm(ll a,ll b){
return a*b/__gcd(a,b);
}
ll t,n,m,a[100005],b[100005],ans[100005],c[100005],vis[100005];
vector<ll>v[100005];
int main(){
scanf("%lld",&t);
while(t--){
scanf("%lld%lld",&n,&m);
for(int i=1;i<=n;i++){
scanf("%lld",&a[i]);v[i].clear();vis[i]=0;
}
for(int i=1;i<=n;i++){
scanf("%lld",&b[i]);
if(a[i]!=b[i]) v[b[i]].push_back(i);
vis[b[i]]=i;
}
for(int i=1;i<=m;i++) scanf("%lld",&c[i]);
ll ma=0,flag=1;
if(v[c[m]].size()) ma=v[c[m]].back(),v[c[m]].pop_back();
else if(vis[c[m]]) ma=vis[c[m]];
if(ma==0){
printf("NO\n");continue;
}
ans[m]=ma;
for(int i=1;i<m;i++){
if(v[c[i]].size()){
ans[i]=v[c[i]].back();
v[c[i]].pop_back();
}
else if(ma) ans[i]=ma;
}
for(int i=1;i<=n;i++){
if(v[b[i]].size()>0){flag=0;break;}
}
if(flag){
printf("YES\n");
for(int i=1;i<=m;i++) printf("%lld ",ans[i]);
printf("\n");
}
else printf("NO\n");
}
system("pause");
return 0;
}
J - ABC Legacy
wa麻了,a是左括号,c是右括号,b两者都可以,然后想了几种方法来避免B匹配到B,但是都不可行,最后只能问别人了,让b当作一个特殊的左括号,弄两个栈,而且一定要注意按照遍历的顺序入栈
ll n;
char s[400005];
vector<pair<ll,ll>>g;
stack<ll>sa,sb;
ll f[400005];
int main(){
cin.tie(0);cout.tie(0);ios::sync_with_stdio(0);
cin>>n;
cin>>s+1;
n<<=1;
ll cnt=0;
for(int i=1;i<=n;i++){
if(s[i]=='A') cnt++;
}
cnt=n/2-cnt;
if(cnt<0){
cout<<"NO\n";
return 0;
}
ll cno=0;
for(int i=1;i<=n;i++){
if(s[i]=='A'){
sa.push(i);
}
if(s[i]=='B'){
if(cnt){
cnt--;
sb.push(i);
}
else{
if(sa.empty()){
cout<<"NO\n";return 0;
}
g.push_back({sa.top(),i});
sa.pop();
}
}
if(s[i]=='C'){
if(!sb.empty()){
g.push_back({sb.top(),i});
sb.pop();
}
else if(!sa.empty()){
g.push_back({sa.top(),i});
sa.pop();
}
else{cout<<"NO\n";return 0;}
}
}
cout<<"YES\n";
for(int i=0;i<g.size();i++) cout<<g[i].first<<" "<<g[i].second<<"\n";
system("pause");
return 0;
}
F - to Pay Respects 贪心
一开始真是没有想到,越分析情况越多,最后就想着应该可以有一个方法可以全都考虑出来,但是还是没想到,,,
将P可以消掉R的这个操作也看做是伤害,也就是把这个关系给简化成造成了P+R的伤害,然后恢复了R,这样就可以去枚举每一个点使用了P会造成多少伤害,最后只取前K大就可以
2021 ICPC Southeastern Europe Regional Contest ABFGJKLN_HeartFireY的博客-CSDN博客
#include <bits/stdc++.h>
#define ll long long
#define ull unsigned long long
#define endl '\n'
#define lowbit(i) (i)&(-i)
#define all(x) (x).begin(),(x).end()
#define MOD(x) (((x)%mod+mod)%mod)
using namespace std;
const ll mod=1e9+7;
const double inf=1e18;
const double eps=1e-8;
ll qpow(ll a,ll b){
ll res=1;
while(b){
if(b&1) res=res*a%mod;
a=a*a%mod;
b>>=1;
}
return res;
}
ll getinv(ll a){return qpow(a,mod-2);}
ll lcm(ll a,ll b){
return a*b/__gcd(a,b);
}
ll n,X,r,p,k;
char s[1000006];
ll a[1000006];
bool cmp(ll a,ll b){
return a>b;
}
int main(){
// cin.tie(0);cout.tie(0);ios::sync_with_stdio(0);
cin>>n>>X>>r>>p>>k;
cin>>s+1;
ll ans=n*X,m=0;
for(int i=1;i<=n;i++){
if(s[i]=='1'){
a[++m]=(n-i+1)*(p+r);
ans-=(n-i+1)*r;
}
else a[++m]=(n-i+1)*p;
}
sort(a+1,a+m+1,cmp);
for(int i=1;i<=k&&i<=m;i++){
ans+=a[i];
}
cout<<ans<<"\n";
system("pause");
return 0;
}
G - Max Pair Matching 排序
输入时先让所有的a[i]<b[i],然后a[i]一定是被减的,b[i]一定是加的,那么就根据b[2]-a[1]>b[1]-a[2]也就是a[1]+b[1]<a[2]+b[2]来排个序,让后n个b去减前n个a就可以了
2021 ICPC Southeastern Europe Regional Contest ABFGJKLN_HeartFireY的博客-CSDN博客
ll n;
struct node{
ll a,b;
bool operator<(const node & o)const{
return a+b<o.a+o.b;
}
}c[200005];
int main(){
// cin.tie(0);cout.tie(0);ios::sync_with_stdio(0);
cin>>n;
for(int i=1;i<=n*2;i++){
cin>>c[i].a>>c[i].b;
if(c[i].a>c[i].b) swap(c[i].a,c[i].b);
}
sort(c+1,c+2*n+1);
ll ans=0;
for(int i=1;i<=n;i++) ans-=c[i].a;
for(int i=n+1;i<=2*n;i++) ans+=c[i].b;
cout<<ans<<endl;
system("pause");
return 0;
}