有一种情况没有看出来看,不应该,3 5 5的答案应该是4,g和r单独做一个,然后再做上两个mixing的,特判一下这种情况就行:有两个取余为2,另一个取余为0
- #include
- #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 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;
- }
如果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博客
- #include
- #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 t,n,m,a[100005],b[100005],ans[100005],c[100005],vis[100005];
- vector
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
- 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当作一个特殊的左括号,弄两个栈,而且一定要注意按照遍历的顺序入栈
- #include
- #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;
- char s[400005];
- vector
>g; - stack
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
size();i++) cout<" "<"\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
- #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<
"\n"; - system("pause");
- return 0;
- }
G - Max Pair Matching 排序
输入时先让所有的a[i]b[1]-a[2]也就是a[1]+b[1]
2021 ICPC Southeastern Europe Regional Contest ABFGJKLN_HeartFireY的博客-CSDN博客
- #include
- #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;
- struct node{
- ll a,b;
- bool operator<(const node & o)const{
- return a+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<
- system("pause");
- return 0;
- }
D2 - Zero-One (Hard Version) 记忆化dp
x>=y和d1是一样的,x
Codeforces Round #821 (Div. 2) A - D - 知乎 (zhihu.com)
- #include
- #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 t,n,x,y;
- char a[5005],b[5005];
- ll pos[5005];
- ll f[5005][5005];
- ll dfs(ll l,ll r){
- if(l>r) return 0;
- if(f[l][r]) return f[l][r];
- ll res=1e18;
- res=dfs(l+1,r-1)+y;
- res=min(res,dfs(l+2,r)+x*(pos[l+1]-pos[l]));
- res=min(res,dfs(l,r-2)+x*(pos[r]-pos[r-1]));
- return f[l][r]=res;
- }
- int main(){
- cin.tie(0);cout.tie(0);ios::sync_with_stdio(0);
- cin>>t;
- while(t--){
- cin>>n>>x>>y;
- cin>>a+1>>b+1;
- ll cnt=0,m=0;
- for(int i=1;i<=n;i++){
- if(a[i]!=b[i]) pos[++cnt]=i;
- }
- if(cnt&1){cout<<"-1\n";continue;}
- if(x>=y){
- if(cnt!=2){
- cout<
2LL*y< - }
- else{
- ll flag=1;
- for(int i=1;i<=n;i++){
- if(a[i]!=b[i]&&a[i+1]!=b[i+1]){
- flag=0;break;
- }
- }
- if(flag) cout<
2LL*y< - else cout<<min(x,2LL*y)<
- }
- }
- else{
- for(int i=1;i<=cnt;i++)
- for(int j=i;j<=cnt;j++) f[i][j]=0;
- ll ans=dfs(1,cnt);
- cout<
- }
- }
- system("pause");
- return 0;
- }
-
相关阅读:
网络通信深入解析:探索TCP/IP模型
前端基础HTML-基础标签
【web渗透思路】框架敏感信息泄露(特点、目录、配置)
接口自动化测试实践指导(下):接口自动化测试断言设置思路
js中的地狱回调是什么
win32程序步骤
SQLite数据库创建表与增删改查
redis学习
C++ 系统标准的输入输出流
数据结构概念部分
-
原文地址:https://blog.csdn.net/weixin_52621204/article/details/126885744