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();
}
咸鱼翻身失败