Codeforces Round #733 Div. 1+Div. 2 +64

A 题意

二进制数串就是只有01的十进制,给一个十进制,拆成最少数量的二进制数串和

A 思路

水题,各数位最大值

A 代码
#include<cstdio>
#include<iostream>
#include<iomanip>
#include<map>
#include<unordered_map>
#include<string>
#include<queue>
#include<stack>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<cstdlib> 
#include<chrono>
#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define endl "\n"
//#define int long long
//#define double long double
using namespace std;
	typedef long long ll;
	const int maxn=400505;
	const int inf=0x3f3f3f3f;
	int n,m,k;
    void YES(){
		cout<<"YES"<<endl;
	}
	void NO(){
		cout<<"NO"<<endl;
	}
	void solve(){
        string s;
		cin>>s;
		int ans=0;
		for(auto i:s){
			ans=max(ans,i-'0');
		}
		cout<<ans<<endl;
	}
	signed main(){
        IOS
		#ifndef ONLINE_JUDGE
		    freopen("IO\\in.txt","r",stdin);
		    freopen("IO\\out.txt","w",stdout);
        #endif
		int tn=1;
		cin>>tn;
		while(tn--){
			solve();
		}
	} 
						
B 题意

nm方格,只有外边一圈可以是1,1的周围八个格子不能是1,最大化1数量,输出方案。

B 思路

分类讨论下就行,简单构造

B 代码
#include<cstdio>
#include<iostream>
#include<iomanip>
#include<map>
#include<unordered_map>
#include<string>
#include<queue>
#include<stack>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<cstdlib> 
#include<chrono>
#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define endl "\n"
//#define int long long
//#define double long double
using namespace std;
	typedef long long ll;
	const int maxn=45;
	const int inf=0x3f3f3f3f;
	int n,m,k;
	int mp[maxn][maxn];
    void YES(){
		cout<<"YES"<<endl;
	}
	void NO(){
		cout<<"NO"<<endl;
	}
	void solve(){
		memset(mp,0,sizeof mp);
        cin>>n>>m;
		if(n%2&&m%2){
			for(int i=1;i<=m;i+=2)
				mp[1][i]=mp[n][i]=1;
			
			for(int i=3;i<n;i+=2)
				mp[i][1]=mp[i][m]=1;
		}
		else if(m%2){
			for(int i=1;i<=m;i+=2)
				mp[1][i]=mp[n][i]=1;
		
			for(int i=3;i<n-1;i+=2)
				mp[i][1]=mp[i][m]=1;
		}
		else if(n%2){
			for(int i=1;i<=m;i+=2){
				mp[1][i]=mp[n][i]=1;
			}
			for(int i=3;i<n;i+=2)
				mp[i][1]=mp[i][m]=1;
		}
		else{
			for(int i=1;i<=m;i+=2)
				mp[1][i]=mp[n][i]=1;
			for(int i=3;i<n-1;i+=2)
				mp[i][1]=mp[i][m]=1;
		}
		for(int i=1;i<=n;i++){
			for(int j=1;j<=m;j++)	cout<<mp[i][j];
			cout<<endl;
		}
		cout<<endl;
	}
	signed main(){
        IOS
		#ifndef ONLINE_JUDGE
		    freopen("IO\\in.txt","r",stdin);
		    freopen("IO\\out.txt","w",stdout);
        #endif
		int tn=1;
		cin>>tn;
		while(tn--){
			solve();
		}
	} 
						
C 题意

假设比了k场,会取最高k-k/4下取整的最高分和为总分,给出你的成绩和对手成绩,问最少再比多少轮你的分有希望比他高。

C 思路

贪心的想,肯定要自己加100,对手加0.我们把我们的分数递增排序,对手递减排序,维护两个指针。算出初始的分数。每次递增轮次k,我们的队尾插100,对手插0.如果发现k递增后k-k/4增加了,就把我们的分数更新成原来的分数+100-指针1指向的分,对手的分数变为原来的+指针2的分,指针12后移。如果k-k/4没有变化,我们的分数还是要更新成原来的分数+100-指针1指向的分,更新指针1,对手的不用管。稍微想一下就明白这个k不会递增很多次。

C 代码
#include<cstdio>
#include<iostream>
#include<iomanip>
#include<map>
#include<unordered_map>
#include<string>
#include<queue>
#include<stack>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<cstdlib> 
#include<chrono>
#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define endl "\n"
//#define int long long
//#define double long double
using namespace std;
	typedef long long ll;
	const int maxn=400505;
	const int inf=0x3f3f3f3f;
	int n,m,k;
	vector<int>v1,v2;

    void YES(){
		cout<<"YES"<<endl;
	}
	void NO(){
		cout<<"NO"<<endl;
	}
	bool cmp(int a,int b){
		return a>b;
	}
	void solve(){
        cin>>n;
		v1.clear(),v2.clear();
		for(int i=1;i<=n;i++){
			int t;
			cin>>t;
			v1.push_back(t);
		}
		for(int i=1;i<=n;i++){
			int t;
			cin>>t;
			v2.push_back(t);
		}
		sort(v1.begin(),v1.end());
		sort(v2.begin(),v2.end(),cmp);
		m=n-n/4;
		int ans=0;
		int c1=0,c2=0;
		int p1=n-m,p2=m;
		for(int i=n-m;i<n;i++){
			c1+=v1[i];
		}
		for(int i=0;i<m;i++){
			c2+=v2[i];
		}
		while(c1<c2){
			ans++;
			n++;
			v1.push_back(100);
			v2.push_back(0);
			if(n-n/4!=m){
				m++;
				c1+=100;
				c2+=v2[p2];
				p2++;
			}
			else{
				c1+=100;
				c1-=v1[p1];
				p1++;
			}
		}
		cout<<ans<<endl;
	}
	signed main(){
        IOS
		#ifndef ONLINE_JUDGE
		    freopen("IO\\in.txt","r",stdin);
		    freopen("IO\\out.txt","w",stdout);
        #endif
		int tn=1;
		cin>>tn;
		while(tn--){
			solve();
		}
	} 
						
D 题意

每个人有一个想送礼物的人,合理分配送礼物的方案,使得

  1. 每个人都收到,每个人都送
  2. 每个人都不送给自己
D 思路

转化成图论问题,人向他想送礼的人连边,我们先跑个拓扑删去环路,环上各点答案就是原来答案。之后我们重新建图,之前环路删去,且一个点最多只有一条入边,多的话直接忽略点剩下的。最后新图是一堆链或者点。跑一下连通块,记录每个块的起点和终点。之后每个块的终点答案设置为下一个块的起点就好了。注意特判只有一个块且是孤立点的情况,这种情况要暴力断一个环。

D 代码
#include<cstdio>
#include<iostream>
#include<iomanip>
#include<map>
#include<unordered_map>
#include<string>
#include<queue>
#include<stack>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<cstdlib> 
#include<chrono>
#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define endl "\n"
//#define int long long
//#define double long double
using namespace std;
	typedef long long ll;
	const int maxn=200005;
	const int inf=0x3f3f3f3f;
	int n,m,k,q;
    vector<int>e[maxn],e2[maxn];
    bool ansed[maxn];
    int ans[maxn];
    int a[maxn];
    int in[maxn],out[maxn];
    int cnt;
    int bein[maxn],ed[maxn];
    void init(){
        for(int i=0;i<=n;i++){
            e[i].clear(),e2[i].clear();
            in[i]=0,out[i]=0;
            ansed[i]=0;cnt=0;
        }
    }
    void dfs(int x){
        int son=0;
        for(auto y:e2[x]){
            dfs(y);
            son++;
        }
        if(!son)
            ed[cnt]=x;
    }
	void solve(){
		cin>>n;
        init();
        for(int i=1;i<=n;i++){
            cin>>ans[i];
            a[i]=ans[i];
            e[i].push_back(ans[i]);
            in[ans[i]]++;
        }
        queue<int>q;
        for(int i=1;i<=n;i++){
            if(!in[i])  q.push(i);
        }
        while(q.size()){
            int x=q.front();q.pop();
            for(auto y:e[x]){
                in[y]--;
                if(!in[y])
                    q.push(y);
            }
        }
        for(int i=1;i<=n;i++)
            if(in[i])
                ansed[i]=1;
        int as=n;
        for(int i=1;i<=n;i++)   in[i]=out[i]=0;
        for(int i=1;i<=n;i++){
            if(ansed[i])    continue;
            if(!ansed[a[i]]&&!in[a[i]]){
                e2[i].push_back(a[i]);
                in[a[i]]=1;
                out[i]=1;
                //ansed[i]=1;
            }
        }
        for(int i=1;i<=n;i++){
            if(!ansed[i]&&!in[i]){
                cnt++;
                bein[cnt]=i;
                dfs(i);
            }
        }
        if(cnt==1){
            as-=1;
            ans[ed[1]]=a[ed[1]];
            for(int i=1;i<=n;i++){
                if(ansed[i]){
                    if(ans[i]==a[ed[1]]){
                        ans[i]=bein[1];
                        break;
                    }
                }
            }
        }
        else{
            for(int i=1;i<=cnt;i++){
                int j=i+1;
                if(i==cnt)  j=1;
                ans[ed[i]]=bein[j];
                as--;
            }
        }
        cout<<as<<endl;
        for(int i=1;i<=n;i++)   cout<<ans[i]<<' ';
        cout<<endl;
	}
	signed main(){
        IOS
		#ifndef ONLINE_JUDGE
		    freopen("IO\\in.txt","r",stdin);
		    freopen("IO\\out.txt","w",stdout);
        #endif
		int tn=1;
		cin>>tn;
		while(tn--){
			solve();
		}
	} 
						
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
本项目是一个基于SpringBoot开发的华府便利店信息管理系统,使用了Vue和MySQL作为前端框架和数据库。该系统主要针对计算机相关专业的正在做毕设的学生和需要项目实战练习的Java学习者,包含项目源码、数据库脚本、项目说明等,有论文参考,可以直接作为毕设使用。 后台框架采用SpringBoot,数据库使用MySQL,开发环境为JDK、IDEA、Tomcat。项目经过严格调试,确保可以运行。如果基础还行,可以在代码基础之上进行改动以实现更多功能。 该系统的功能主要包括商品管理、订单管理、用户管理等模块。在商品管理模块中,可以添加、修改、删除商品信息;在订单管理模块中,可以查看订单详情、处理订单状态;在用户管理模块中,可以注册、登录、修改个人信息等。此外,系统还提供了数据统计功能,可以对销售数据进行统计和分析。 技术实现方面,前端采用Vue框架进行开发,后端使用SpringBoot框架搭建服务端应用。数据库采用MySQL进行数据存储和管理。整个系统通过前后端分离的方式实现,提高了系统的可维护性和可扩展性。同时,系统还采用了一些流行的技术和工具,如MyBatis、JPA等进行数据访问和操作,以及Maven进行项目管理和构建。 总之,本系统是一个基于SpringBoot开发的华府便利店信息管理系统,使用了Vue和MySQL作为前端框架和数据库。系统经过严格调试,确保可以运行。如果基础还行,可以在代码基础之上进行改动以实现更多功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值