题单收集册2

7-11 病毒溯源

1.dfs

找最长链

#include<bits/stdc++.h>
using namespace std;
const int N=1e4+10;
vector<int>a[N];
int t[N];
int n;
vector<int>temp;
void dfs(int t,vector<int>&p){
    if(p.size()>temp.size()) {
        temp.clear();
        temp = p;
    }
    for(auto u:a[t]){
        p.push_back(u);
        dfs(u,p);
        p.pop_back();
    }
}
int main(){
    cin>>n;
    temp.reserve(n);
    memset(t,0,sizeof t);
    for(int i=0;i<n;i++){
        int k;
        cin>>k;
        for(int j=0;j<k;j++){
            int p=0;
            cin>>p;
            t[p]=1;
            a[i].push_back(p);
        }
        sort(a[i].begin(),a[i].end());
    }
    for(int i=0;i<n;i++){
        if(!t[i]) {
            vector<int> p;
            p.reserve(n);
            p.push_back(i);
            dfs(i,p);
        }
    }
    cout<<temp.size()<<endl;
    for(int i=0;i<temp.size();i++){
        cout<<temp[i];
        if(i!=temp.size()-1) cout<<" ";
    }
    return 0;
}

7-10 列车厢调度

2.数据结构:栈和容器的简单应用

#include<bits/stdc++.h>
using namespace std;
const int N=1e4;
int n;
int main(){
    string a,b;
    cin>>a>>b;
    stack<char>p;
    vector<string>arr(100);
    int k=a.size();
    int i=0;
    int j=0;
    int op=0;
    while(k){
        if(p.size()!=0&&p.top()==b[j]){
            arr[op++]="3->2";
            p.pop();
            j++;
            continue;
        }
        if(a[i]==b[j]) {
            arr[op++] = "1->2";
            j++;
        }
        else {
            arr[op++]="1->3";
            p.push(a[i]);
        }
        i++;
        k--;
    }
    int s=0;
    int sizep=p.size();
    for( i=a.size()-sizep;i<a.size();i++){
        if(b[i]==p.top())s++;
        p.pop();
        arr[op++]="3->2";
    }
    if(s==sizep) {
        for(i=0;i<op;i++){
            cout<<arr[i]<<endl;
        }
    }
    else cout<<"Are you kidding me?";
    return 0;
}

7-9 哈利·波特的考试

3.Floyd算法

#include<bits/stdc++.h>
using namespace std;
const int inf=99999;
const int maxn=101;
int n,m,D[maxn][maxn];
void Floyd(){
    for(int k=1;k<=n;k++)
        for(int i=1;i<=n;i++)
            for(int j=1;j<=n;j++){
                if(D[i][k]+D[k][j]<D[i][j]){
                    D[i][j]=D[i][k]+D[k][j];
                }
            }
}
int main()
{
    fill(D[0],D[0]+maxn*maxn,inf);
    cin>>n>>m;
    for(int i=0;i<m;i++){
        int a,b,c;
        cin>>a>>b>>c;
        D[a][b]=D[b][a]=c;
    }
    Floyd();
    int index=0,min=inf,max;
    for(int i=1;i<=n;i++){
        max=0;
        for(int j=1;j<=n;j++){
            if(i==j) continue;
            if(D[i][j]>max) max=D[i][j];
        }
        if(max<min){
            min=max;
            index=i;
        }
    }
    if(index==0) cout<<"0\n";
    else cout<<index<<" "<<min<<endl;
    return 0;
}

7-12 文件传输

4.并查集问题。

#include<bits/stdc++.h>
using namespace std;
const int N=1e4+10;
int n;
vector<int>a;
int find(int x){
    if(x!=a[x]) a[x]=find(a[x]);
    return a[x];
}
void connect(int x,int y){
    int xx=find(x);
    int yy=find(y);
    if(xx==yy) return ;
    a[yy]=xx;
}
int main(){
    cin>>n;
    a.reserve(n);
    for(int i=1;i<=n;i++){
        a[i]=i;
    }
    char s;
    cin>>s;
    while(s!='S'){
        int x,y;
        cin>>x>>y;
        if(s=='I') connect(x,y);
        else {
            if(find(x)==find(y)) cout<<"yes"<<endl;
            else cout<<"no"<<endl;
        }
        cin>>s;
    }
    set<int>b;
    for(int i=1;i<=n;i++){
        b.insert(find(i));
    }
    if(b.size()==1) cout<<"The network is connected.";
    else cout<<"There are "<<b.size()<<" components.";
    return 0;
}

7-12 部落

5.并查集问题

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=10010;
int arr[N];
int Find(int x)
{
    if (arr[x]!=x)
        arr[x]=Find(arr[x]);
    return arr[x];
}
void Connect(int x,int y){
    int mm=Find(x);
    int nn=Find(y);
    if(mm==nn) return ;
    arr[nn]=mm;
}
int main(){
    memset(arr,0,sizeof arr);
    int n;
    cin>>n;
    for(int i=1;i<N;i++){
        arr[i]=i;
    }
    int maxn=0;
    for(int i=0;i<n;i++){
        int a;
        cin>>a;
        int q[a];
        for(int j=0;j<a;j++){
            cin>>q[j];
            maxn=max(maxn,q[j]);
            if(j!=0)
                Connect(q[j-1],q[j]);
        }
    }
    set<int>s;
    for(int j=1;j<=maxn;j++){
        s.insert(Find(arr[j]));
    }
    cout<<maxn<<" "<<s.size()<<endl;
    int time =0;
    cin>>time;
    for(int i=0;i<time;i++){
        int t1,t2;
        cin>>t1>>t2;
        if(Find(t1)==Find(t2)) cout<<"Y"<<endl;
        else cout<<"N"<<endl;
    }
    return 0;
}

7-10 家庭房产

6.并查集问题提升

#include<bits/stdc++.h>
using namespace std;
int n,co;
const int N = 1e4+10;
struct edge{
    int a,b;
}e[N];
bool st[N];
int fa[N],peo[N],avgs[N],avga[N];

int find(int x)
{
    if(fa[x]!=x) fa[x]=find(fa[x]);
    return fa[x];
}

void unionf(int a,int b)
{
	int faa=find(a),fbb=find(b);
	if(faa!=fbb)
	{
		fa[max(faa,fbb)]=min(faa,fbb);     //把id号较小的那个人设定为父亲
		peo[min(faa,fbb)]+=peo[max(faa,fbb)];    //把人数加到较小id的人数那里
		avgs[min(faa,fbb)]+=avgs[max(faa,fbb)];  //把房屋数量加到较小id的人数那里
		avga[min(faa,fbb)]+=avga[max(faa,fbb)];  //把房屋面积加到较小id的人数那里
	}
}
struct family{
	int id,cnt,avgs,avga;
	
	bool operator < (family x)
	{
		if(x.cnt*avga==cnt*x.avga)
		{
			return id<x.id;
		}
		return x.cnt*avga>cnt*x.avga;
	}
};
int main()
{
	for(int i=0;i<N;i++) fa[i]=i,peo[i]=1;
    cin>>n;
    int id,father,mother,k;
    for(int i=0;i<n;i++)
    {
        cin>>id>>father>>mother>>k;
        if(father!=-1) e[co++]={id,father};
        if(mother!=-1) e[co++]={id,mother};
        st[id]=true; //有的人可能只有一个人,需要特殊标记
		int kid;
        for(int j=0;j<k;j++)
        {
            cin>>kid;
            e[co++]={id,kid};
        }
        cin>>avgs[id]>>avga[id];
    }
    for(int i=0;i<co;i++)
    {
        int a=e[i].a,b=e[i].b;
    	st[a]=st[b]=true;
		unionf(a,b);
    }
    vector<family> ans;
    for(int i=0;i<N;i++)
    {
    	if(st[i] && fa[i]==i)       //这个人真实存在并且父亲结点是自己,就加进去
    		ans.push_back({i,peo[i],avgs[i],avga[i]});
	}
	sort(ans.begin(),ans.end());
	cout<<ans.size()<<endl;
	for(auto t:ans) printf("%04d %d %.3lf %.3lf\n",t.id,t.cnt,(double)t.avgs/t.cnt,(double)t.avga/t.cnt);
    return 0;
}

P9242 [蓝桥杯 2023 省 B] 接龙数列

7.背包

#include<bits/stdc++.h>
using namespace std;
const int N=1e5;
#define PII pair<int,int>
int n;
vector<PII>a(N);
int dp[N][15];
int main() {
    cin >> n;
    for (int i = 1; i <= n; i++) {
        string s;
        cin >> s;
        a[i].first=*s.begin() - '0';
        a[i].second=*s.rbegin() - '0';
    }
    for (int i = 1; i <= n; i++) {
        for (int j = 0; j <= 9; j++) {
            if (j == a[i].second) {
                dp[i][j] = max(dp[i - 1][j], dp[i - 1][a[i].first] + 1);
            } else {
                dp[i][j] = dp[i - 1][j];
            }
        }
    }
    int m = 0;
    for (int j = 0; j <= 9; j++) {
        m = max(m, dp[n][j]);
    }
    cout << n - m ;
    return 0;
}

  • 7
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值