校内周赛4

A

字符串乘法加取余

#include <bits/stdc++.h>

using namespace std;
#define int long long
#define ll long long
#define N 1000000

int mod=11;
void solve() {
	string s;
	while(cin>>s){
		//cin >> s;
		int ans=s[s.length()-1]-'0';
        if(s[s.length()-1]=='X') ans=10;
		int sum=0;
		int j=0;
		for(int i=0;i<s.length()-1;i++){
			if(s[i]!='-'){
                j++;
                if(s[i]!='X')
				sum+=j*(s[i]-'0');   
                else
                sum+=10*j;  
				
			}
		}
      //  cout<<sum<<'\n';
        sum%=mod;
		if(sum==ans){
			cout<<"Right";
		}
		else{
			for(int i=0;i<s.length()-1;i++){
				cout<<s[i];
			}
            if(sum!=10)
			cout<<sum;
            else
            cout<<"X";
		}
        cout<<'\n';
	}
}


signed main() {
	ios::sync_with_stdio(false);
	cin.tie(nullptr);
	int t = 1;
	//cin >> t;

	while (t--) {
		solve();
	}
	return 0;
}

B

对于每条通道,两个岛都加1,最后for循环判断谁最大即可

#include <bits/stdc++.h>

using namespace std;
#define int long long
#define ll long long
#define N 1000000

int ans[N];
void solve() {
	int n;
	cin>>n;
	int x,y;
	while(cin>>x>>y){
		ans[x]++;
		ans[y]++;
	}
	int sum=0;
	int dd=0;
	for(int i=1;i<=n;i++){
		if(sum<ans[i]){
			sum=ans[i];
			dd=i;
		}
	}
	cout<<sum;
}


signed main() {
	ios::sync_with_stdio(false);
	cin.tie(nullptr);
	int t = 1;
	//cin >> t;

	while (t--) {
		solve();
	}
	return 0;
}

C

优先队列 (结构体自定义比较)(重载函数)

按照y的大小排序贪心,大于前面符合线段的尾部答案+1,不符合遍历下一个

#include <bits/stdc++.h>

using namespace std;
#define int long long
#define ll long long
#define N 1000000

struct node{
	int x,y;
	bool operator<(const node& a)const{
		
		return a.y<y;
	}
};
void solve() {
	int n;
	cin >> n;
	priority_queue<node>q;
	for(int i=1;i<=n;i++){
		int l,r;
		cin>>l>>r;
		q.push({l,r});
	}
	int pre=q.top().y;
	q.pop();
	int ans=1;
	while(q.size()>0){
		
		auto[l,r]=q.top();
		//cout<<l<<' '<<r<<'\n';
		q.pop();
		if(l>=pre){
			pre=r;
			ans++;
		}
	}
	cout<<ans;
	
}


signed main() {
	ios::sync_with_stdio(false);
	cin.tie(nullptr);
	int t = 1;
	//cin >> t;

	while (t--) {
		solve();
	}
	return 0;
}

D

set中lower_bound用法

利用容器set的二分,每个人都只会带一次帽子,nlogn通过

#include <bits/stdc++.h>

using namespace std;
#define int long long
#define ll long long
#define N 1000000


void solve() {
	int n,m;
	cin >>n>>m;
	set<int>se;
	for(int i=1;i<=n;i++){
		se.insert(i);
	}
	int ans=0;
	for(int i=1;i<=m;i++){
		int x,y;
		cin>>x>>y;
		while(1){
			auto it=se.lower_bound(x);
			if(*it>=x&&*it<=y){
				se.erase(*it);
				ans++;
			}
			else{
				break;
			}
		}
		cout<<n-ans<<'\n';
	}
}


signed main() {
	ios::sync_with_stdio(false);
	cin.tie(nullptr);
	int t = 1;
	//cin >> t;

	while (t--) {
		solve();
	}
	return 0;
}

F

SPFA 算法详解( 强大图解,不会都难!)_图解spfa-CSDN博客

具体浏览器搜索spfa,跟dij不同的是,有人交dij也过了,数据不行

#include <bits/stdc++.h>

using namespace std;
#define int long long
#define ll long long
#define N 1000000
struct edge{int v,w;};
vector<edge> e[N];
int vis[N],cnt[N];
int h[N],d[N];
int n,m;
int inf=1e18;
void spfa(){
	queue<int>q;
	for(int i=1;i<=n;i++) h[i]=inf;
	for(int i=1;i<=n;i++) cnt[i]=vis[i]=0;
	h[1]=0,vis[1]=1;q.push(1);
	while(q.size()){
		int u=q.front(); q.pop();vis[u]=0;
		for(auto ed : e[u]){
			int v=ed.v,w=ed.w;
			if(h[v]>h[u]+w){
				h[v]=h[u]+w;
				cnt[v]=cnt[u]+1;
				if(cnt[v]>n){
					printf("- 1\n");exit(0);
				}
				if(!vis[v])q.push(v),vis[v]=1;
			}
		}
	}
}
void solve() {

	cin >> n >> m;
	for(int i=1;i<=n;i++) e[i].clear();
	
	for(int i=0;i<m;i++){
		int u,v,w;
		cin>>u>>v>>w;
		e[u].push_back({v,w});
		e[v].push_back({u,w});
	}
	spfa();
	cout<<h[n]<<'\n';
}


signed main() {
	ios::sync_with_stdio(false);
	cin.tie(nullptr);
	int t = 1;
	//cin >> t;

	while (t--) {
		solve();
	}
	return 0;
}

  • 11
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值