KYOCERA Programming Contest 2022(AtCoder Beginner Contest 271)

KYOCERA Programming Contest 2022(AtCoder Beginner Contest 271)

A - 484558

思路:进制转换
没啥巧解,就十进制转十六进制

#include
using namespace std;
#define int long long
#define rep(i,a,n) for(int i=a;i<=n;i++)
#define per(i,a,n) for(int i=n;i>=a;i--)
#define pb push_back
#define SZ(v) ((int)v.size())
#define fs first
#define sc second
const int N=2e6+10,M=2e5;
typedef double db;
typedef pairpii;
int n,m,k,Q,cnt,t;
vectordel;
int l[200010],l1[N],r[200010],r1[N];
int prime[N];
bool st[N];
bool isPrime(int n)
{
	if (n <= 3)//当n不大于3时只有1不是素数
		return n > 1;
	if (n % 6 != 1 && n % 6 != 5)//只有6i+1和6i+5可能是素数
		return false;
	for (int i = 5; i <= sqrt(n); i += 6)
	{
		if (n % i == 0 || n % (i + 2) == 0)
			return false;
	}
	return true;
}
mapmp;
void solve() {	
	int n;cin>>n;
	int sum=0;
	int x=n/16;
	n%=16;
    for(int i=0;i<16;i++){
        if(i<=9)mp[i]=char(i+'0');
        else {
            mp[i]=(char)(i-10+'A');
        }
    }
	cout<>t;
    t=1;
    while(t--)solve();
}

B - Maintain Multiple Sequences

思路:
直接取出对应位置的值即可

#include
using namespace std;
#define int long long
#define rep(i,a,n) for(int i=a;i<=n;i++)
#define per(i,a,n) for(int i=n;i>=a;i--)
#define pb push_back
#define SZ(v) ((int)v.size())
#define fs first
#define sc second
const int N=2e5+10,M=2e5;
typedef double db;
typedef pairpii;
int n,m,k,Q,cnt,t;
vectordel;
int l[200010],l1[N],r[200010],r1[N];
int prime[N];
bool st[N];
bool isPrime(int n)
{
	if (n <= 3)//当n不大于3时只有1不是素数
		return n > 1;
	if (n % 6 != 1 && n % 6 != 5)//只有6i+1和6i+5可能是素数
		return false;
	for (int i = 5; i <= sqrt(n); i += 6)
	{
		if (n % i == 0 || n % (i + 2) == 0)
			return false;
	}
	return true;
}
mapmp;
void solve() {	
	int n,m;
	cin>>n>>m;
	vectorg[N];
	for(int i=1;i<=n;i++){
	    int x;
	    cin>>x;
	    for(int j=1;j<=x;j++){
	        int y;
	        cin>>y;
	        g[i].push_back(y);
	    }
	}
	while(m--){
	    int i,j;
	    cin>>i>>j;
	    j--;
	    cout<>t;
    t=1;
    while(t--)solve();
}

C - Manga

思路:二分
二分答案然后看 mid 是不是满足能构成 1到 mid里面的所有数,能就继续二分,输出答案即可

    #include
    using namespace std;
    #define int long long
    #define rep(i,a,n) for(int i=a;i<=n;i++)
    #define per(i,a,n) for(int i=n;i>=a;i--)
    #define pb push_back
    #define SZ(v) ((int)v.size())
    #define fs first
    #define sc second
    const int N=2e5+10,M=2e5;
    typedef double db;
    typedef pairpii;
    int n,m,k,Q,cnt,t;
    vectordel;
    int l[200010],l1[N],r[200010],r1[N],b[N];
    int prime[N];
    bool st[N];
    bool isPrime(int n)
    {
    	if (n <= 3)//当n不大于3时只有1不是素数
    		return n > 1;
    	if (n % 6 != 1 && n % 6 != 5)//只有6i+1和6i+5可能是素数
    		return false;
    	for (int i = 5; i <= sqrt(n); i += 6)
    	{
    		if (n % i == 0 || n % (i + 2) == 0)
    			return false;
    	}
    	return true;
    }
    unordered_mapmp;
    int f[110][10100];
    pii lst[110][10100];
    void dfs(int i,int j){
        if(i==0) return ;
        dfs(i-1,j-lst[i][j].first);
        if(lst[i][j].second==1) cout<<"H";
        else cout<<"T";
    }
    priority_queueq;
    bool check(int mid){
        int x=0,y=0;
        rep(i,1,mid){
            if(!mp[i])x++;
        }
        if(n-(mid-x)>=x*2)return true;
        else return false;
        //1 3 5 7 8 9
    }
    //int n;
    void solve() {	
    	cin>>n;
        vectora(n);
    	for(auto&i:a) {
    	    cin>>i;
    	    mp[i]++;
    	}
    	sort(a.begin(),a.end());
    	int l=0,r=n;
    	while(l>1;
    	    if(check(mid)){
    	        l=mid;
    	       //cout<<"l== "<>t;
        t=1;
        while(t--)solve();
    }

D - Flip and Adjust

思路:动态规划
类似于背包,然后就是判断他前面一个数能不能转换过来能就记录该值以及路径即可,然后dfs反向判断满足条件的路径

#include
using namespace std;
#define int long long
#define rep(i,a,n) for(int i=a;i<=n;i++)
#define per(i,a,n) for(int i=n;i>=a;i--)
#define pb push_back
#define SZ(v) ((int)v.size())
#define fs first
#define sc second
const int N=2e5+10,M=2e5;
typedef double db;
typedef pairpii;
int n,m,k,Q,cnt,t;
vectordel;
int l[200010],l1[N],r[200010],r1[N],a[N],b[N];
int prime[N];
bool st[N];
bool isPrime(int n)
{
	if (n <= 3)//当n不大于3时只有1不是素数
		return n > 1;
	if (n % 6 != 1 && n % 6 != 5)//只有6i+1和6i+5可能是素数
		return false;
	for (int i = 5; i <= sqrt(n); i += 6)
	{
		if (n % i == 0 || n % (i + 2) == 0)
			return false;
	}
	return true;
}
mapmp;
int f[110][10100];
pii lst[110][10100];
void dfs(int i,int j){
    if(i==0) return ;
    dfs(i-1,j-lst[i][j].first);
    if(lst[i][j].second==1) cout<<"H";
    else cout<<"T";
}
priority_queueq;
void solve() {	
	int n,m;cin>>n>>m;
	for(int i=1;i<=n;i++){
	    cin>>a[i]>>b[i];
	}
	f[0][0]=1;
	for(int i=1;i<=n;i++){
	    for(int j=0;j<=m;j++){  
	        if(j>=a[i]){
	            if(f[i-1][j-a[i]]){f[i][j]=1;lst[i][j]={a[i],1};}
	        }
	        if(j>=b[i]){
	            
	            if(f[i-1][j-b[i]]){f[i][j]=1;lst[i][j]={b[i],2};}
	        }
	    }
	}
	if(f[n][m]){
	    cout<<"Yes\n";
	    
	}
	else {
	    cout<<"No";
	    return ;
	}
	dfs(n,m);
}
signed main(){
    //cin>>t;
    t=1;
    while(t--)solve();
}

你可能感兴趣的:(算法,数据结构)