20240320暑期实习

第1题-安排座位-模拟+二进制

#include<bits/stdc++.h>

using namespace std;

void solve(){
	int m, n, x;
	cin>>m>>n>>x;
	int Assign[x][2];
	for(int i = 0; i < x; i++){
		cin>>Assign[i][0]>>Assign[i][1];
	}
	int ans = 0;
	for(int temp = 1; temp < (1<<x); temp++){
		int curans = 0, flag = 0;
		for(int sta = 0; sta < n; sta++){
			int seats = 0;
			for(int pas = 0; pas < x; pas++){
				if((temp>>pas) & 1){
					if(sta >= Assign[pas][0] && sta < Assign[pas][1]) {seats++;}
				}
			}
			if(seats > m){flag=1; break;}
			curans += seats;
		}
		if(flag) {continue;}
		if(curans > ans) ans = curans;
	}
	cout<<ans<<endl;
}


signed main(){
	solve();
}

第2题-积木塔-模拟+递归

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

int tower[1001], top=-1;

void insertBlock(int block){
	int sum = 0, flag = 0;
	for (int j = top; j >= 0; j--){
		sum += tower[j];
		if(sum == block)	{top = j-1;	flag = 1;break;}
	}
	if(flag) insertBlock(block*2);
	else {tower[++top] = block;}
}


void solve(){
	int blocks[1001], num=0;
	int val;
	while(cin>>val)	{blocks[num++] = val;}
	for (int i=0; i < num; i++)	{insertBlock(blocks[i]);}
	for (int j=top; j > 0; j--)	{cout<<tower[j]<<' ';}
	cout<<tower[0]<<endl;
}


signed main(){
	solve();
}

第3题-循环依赖-DFS

#include<bits/stdc++.h>

using namespace std;

vector<int> depend[10001];
int vis[10001] = {0}, onpath[10001] = {0}, flag = 0;
int curstack[10001], top=-1, begining;

void dfs(int cur){
	if (onpath[cur]) {begining = cur; flag = 1; return;}
	onpath[cur] = 1; curstack[++top] = cur;
	vis[cur] = 1;
	for (long unsigned int i = 0; i < depend[cur].size(); i++){
		int dep = depend[cur][i];
        dfs(dep);
		if(flag) return;
	}
	top--;
	onpath[cur] = 0;
} 


void solve(){
	int n, maxn = 0;
	cin>>n;
	for (int i = 0; i < n; i++){
		int m, s, t;
		cin>>m>>s;
		maxn = max(s, maxn);
		for (int j = 0; j < m-1 ; j++){
			cin>>t;
			depend[s].push_back(t);
			maxn = max(t, maxn);
		}
	}
	for (int i = 1; i <= maxn; i++){
		if (!vis[i]) dfs(i);
		if (flag) break;
	}
	
	int endid = top, startid;
	int minn = maxn;
	while(curstack[top+1] != begining && top >= 0){
		if(curstack[top] < minn){
			minn = curstack[top];
			startid = top;
		}
		top--;
	}
	
	for(int i = startid; i <= endid; i++) cout<<curstack[i]<<' ';
	for(int i = top+1; i <= startid; i++) cout<<curstack[i]<<' ';
	
}


signed main(){
	solve();
}
posted @ 2025-03-23 00:41  zerolt  阅读(16)  评论(0)    收藏  举报