hey_left 16 Codeforces Round 827 (Div. 4)

题目链接

A.

判最大的数是不是另外两个数的和

#include <bits/stdc++.h>
using namespace std;

#define int long long
const int N=1e5+10;

void solve(){
    int a,b,c;cin>>a>>b>>c;
    cout<<(max({a,b,c})==a+b+c-max({a,b,c}) ? "YES" : "NO")<<'\n';
}

signed main(){
    ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);
    int hey_left=1;
    cin>>hey_left;
    while(hey_left--){
        solve();
    }
}

B.

排序后判断

#include <bits/stdc++.h>
using namespace std;

#define int long long
const int N=1e5+10;

void solve(){
    int n;cin>>n;
    vector<int>a(n+1);
    for(int i=1;i<=n;i++)cin>>a[i];
    sort(a.begin()+1,a.end());
    bool f=0;
    for(int i=2;i<=n;i++){
        if(a[i]>a[i-1])continue;
        f=1;
        break;
    }
    cout<<(f ? "NO" : "YES")<<'\n';
}

signed main(){
    ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);
    int hey_left=1;
    cin>>hey_left;
    while(hey_left--){
        solve();
    }
}

C.

最后刷的颜色一定整行或整列都是这种颜色
又整行整列一定会影响其他行或列

#include <bits/stdc++.h>
using namespace std;

#define int long long
const int N=1e5+10;

void solve(){
    char g[10][10];
    for(int i=1;i<=8;i++){
        for(int j=1;j<=8;j++){
            cin>>g[i][j];
        }
    }
    for(int i=1;i<=8;i++){
        if(g[i][1]=='R'){
            bool f=0;
            for(int j=2;j<=8;j++){
                if(g[i][j]=='R')continue;
                f=1;
                break;
            }
            if(!f){
                cout<<"R"<<'\n';
                return ;
            }
        }
    }
    cout<<"B"<<'\n';
}

signed main(){
    ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);
    int hey_left=1;
    cin>>hey_left;
    while(hey_left--){
        solve();
    }
}

D.

值域较小
考虑把值的下标记录下来,再降序排
遍历的时候,枚举值域,取最大下标
注意这里采用记忆化,并且还要标记vis,若vis过了,那么一定有记忆,如果没有就记忆,说明它没有符合条件的,直接跳过

#include <bits/stdc++.h>
using namespace std;

#define int long long
const int N=1e5+10;
bool cmp(int x,int y){
    return x>y;
}
void solve(){
    int n;cin>>n;
    vector<int>a(n+1);
    vector<int>b[1010];
    for(int i=1;i<=n;i++){
        cin>>a[i];
        b[a[i]].push_back(i);
    }
    map<int,int>mp;
    vector<int>vis(1010);
    int ma=-1;
    for(int i=1;i<=1000;i++)sort(b[i].begin(),b[i].end(),cmp);
    for(int i=1;i<=n;i++){
        if(vis[a[i]]){
            if(mp[a[i]]){
                ma=max(ma,i+mp[a[i]]);
                continue;
            }else ma=max(ma,-1ll);
            continue;
        }
        if(mp[a[i]]){
            ma=max(ma,i+mp[a[i]]);
            vis[a[i]]=1;
            continue;
        }
        for(int j=1000;j>=1;j--){
            if(__gcd(a[i],j)==1&&b[j].size()){
                mp[a[i]]=max(b[j][0],mp[a[i]]);
                ma=max(ma,i+mp[a[i]]);
            }
        }
        vis[a[i]]=1;
    }
    cout<<ma<<'\n';
}

signed main(){
    ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);
    int hey_left=1;
    cin>>hey_left;
    while(hey_left--){
        solve();
    }
}

E.

一个前缀和
一个数组维护到第i个阶梯为止最高的阶梯,二分

#include <bits/stdc++.h>
using namespace std;

#define int long long
const int N=1e5+10;

void solve(){
    int n,q;cin>>n>>q;
    vector<int>a(n+1),dp(n+1),pre(n+1);
    for(int i=1;i<=n;i++){
        cin>>a[i];
        pre[i]=pre[i-1]+a[i];
        dp[i]=max(a[i],dp[i-1]);
    }
    while(q--){
        int k;cin>>k;
        int ans=upper_bound(dp.begin(),dp.end(),k)-dp.begin()-1;
        ans=pre[ans];
        cout<<ans<<' ';
    }
    cout<<'\n';
}

signed main(){
    ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);
    int hey_left=1;
    cin>>hey_left;
    while(hey_left--){
        solve();
    }
}

F.

s,t中都有一个a,
如果t中出现非a的字符,那么就是yes
若都只有a,则比较长度

#include<bits/stdc++.h>
#define int long long
using namespace std;
int t,n;
int to[3][30];
signed main()
{
	ios::sync_with_stdio(0);
	cin>>t;
	while(t--)
	{
		cin>>n;
		int f=0,f1=0;
		int s1=0,s2=0;
		while(n--)
		{
			int op;
			cin>>op;
			int x;
			string s;
			cin>>x>>s;
			for(int i=0;i<s.length();i++)
			{
				if(s[i]!='a')
				{
					if(op==2) f=1;
					else f1+=x;
				}
				else
				{
					if(op==1) s1+=x;
					else s2+=x;
				}
			}
			if(f||s1<s2&&!f1) cout<<"YES\n";
			else cout<<"NO\n";
		}
	}
}

G.

位运算操作
每次至少多一个位置变成1,且位置越高越好

#include<bits/stdc++.h>
#define int long long
#define db double
#define rtn return
using namespace std;

const int N=2e5+5;
const int M=1e5;
const int Mod=1e5;
const int INF=1e5;

int n,m,p,T,a[N],ans,vis[N];
queue<int > q;

void solve(){
	cin>>n;
	for(int i=1;i<=n;i++)cin>>a[i];
	int sum=0;
	for(int i=1;i<=max(32ll,n);i++){
		int mxid=0;
		for(int j=1;j<=n;j++){
			if(vis[j])continue;
			if((sum|a[j])>(sum|a[mxid]))mxid=j;
		}
		if(!mxid)break;
		vis[mxid]=i;
		sum|=a[mxid];
		q.push(mxid);
	}
	while(q.size()){
		cout<<a[q.front()]<<' ';
		q.pop();
	}
	
	for(int i=1;i<=n;i++){
		if(!vis[i])cout<<a[i]<<' ';
	}
	cout<<endl;
	
	for(int i=1;i<=n;i++)vis[i]=0;
}
signed main(){
	cin>>T;
	while(T--)solve();
	return 0;
}
posted @ 2024-01-25 20:28  WW爆米花  阅读(3)  评论(0编辑  收藏  举报