活动安排问题

//实现按结束时间从小到大排序,可用结构体存放,结构体包含开始时间,结束时间,序号
#include <iostream>
using namespace std;
int c[1000];
void select(int n,int a[],int b[],int c[]){
	c[1]=1;
	int j=1;
	for(int i=2;i<=n;i++){
		if(a[i]>=b[j]){
			c[i]=1;
			j=i;
		}
		else{
			c[i]=0;
		}
	}
}
int main(){
	int n;
	cin>>n;
	int a[n],b[n];
	for(int i=1;i<=n;i++){
		cin>>a[i]>>b[i];
	}
	select(n,a,b,c);
	for(int i=1;i<=n;i++){
		if(c[i]==1)cout<<i<<endl;
	}
}

 哈夫曼编码

//从文件中读取然后在输出到文件中,进行编码和译码
#include <iostream>
#include <fstream>
#include <cstring>
#include <math.h>
using namespace std;
#define  n 100
#define m 2*n-1
typedef struct{
	char ch;
	char bits[9];
	int len;
}CodeNode;
typedef CodeNode HuffmanCode[n + 1];
typedef struct{
	int weight;
	int lchild, rchild, parent;
}HTNode;
typedef HTNode HuffmanTree[m + 1];
int num;
char st[10000];
char get[10000];
void select(HuffmanTree HT, int k, int&s1, int&s2){
	int i, j;
	int minl = 32767;
	for (i = 1; i <= k; i++){
		if (HT[i].weight<minl&&HT[i].parent == 0){
			j = i;
			minl = HT[i].weight;
		}
	}
	s1 = j;
	minl = 32767;
	for (i = 1; i <= k; i++){
		if (HT[i].weight<minl&&HT[i].parent == 0 && i != s1){
			j = i;
			minl = HT[i].weight;
		}
	}
	s2 = j;
}
int countAsc(char *s, int cnt[], char str[]){
	char *p;
	int i, j, k = 0;
	int temp[257];
	for (i = 0; i<257; i++){
		temp[i] = 0;
	}
	for (p = s; *p != '\0'; p++){
		temp[*p]++;
	}
	for (i = 0, j = 0; i <= 256; i++){
		if (temp[i] != 0){
			j++;
			str[j] = i;
			cnt[j] = temp[i];
		}
	}
	num = j;
	return j;
}
void createHuffmanTree(HuffmanTree& HT, HuffmanCode&HC, int cnt[], char str[]){
	int i, s1, s2;
	for (i = 1; i <= 2 * num - 1; i++){
		HT[i].lchild = 0;
		HT[i].rchild = 0;
		HT[i].parent = 0;
		HT[i].weight = 0;
	}
	for (i = 1; i <= num; i++){
		HT[i].weight = cnt[i];
	}
	for (i = num + 1; i <= 2 * num - 1; i++){
		select(HT, i - 1, s1, s2);
		HT[s1].parent = i;
		HT[s2].parent = i;
		HT[i].lchild = s1;
		HT[i].rchild = s2;
		HT[i].weight = HT[s1].weight + HT[s2].weight;
	}
	for (i = 1; i <= num; i++){
		HC[i].ch = str[i];
	}
}
void huffmanencoding(HuffmanTree &HT, HuffmanCode &HC){
	int c, p, i;
	char cd[n];
	int start;
	cd[num] = '\0';
	for (i = 1; i <= num; i++){
		start = num;
		c = i;
		while ((p = HT[c].parent)>0){
			start--;
			cd[start] = (HT[p].lchild == c) ? '0' : '1';
			c = p;
		}
		strcpy(HC[i].bits, &cd[start]);
		HC[i].len = num - start;
	}
}
void decode(HuffmanCode &HC,char s[]){
	char ch;
	int num = 0;
	ifstream in("CodeFile.txt");
	string line;
	char result[1000];
	int z = 0;
	if (in){
		while (!in.eof()){
			in >> ch;
			result[z] = ch;
			z++;
			num++;
		}
	}
	else{
		cout << "没有此文件或读取错误!" << endl;
	}
	result[num-1] = '\0';
	in.close();
	char str[1000];
	char cd[9];
	int i, j, k = 0, p = 0, flag;
	ofstream ou;
	ou.open("TextFile.txt");
	while (result[p] != '\0'){
		flag = 0;
		for (i = 0; i<num && flag == 0 && result[p] != '\0'; i++){
			cd[i] = ' ';
			cd[i + 1] = '\0';
			cd[i] = result[p++];
			for (j = 1; j <= num; j++){
				if (strcmp(HC[j].bits, cd) == 0){
					str[k] = HC[j].ch;
					ou<<HC[j].ch;
					k++;
					flag = 1;
					break;
				}
			}
		}
	}
	ou.close();
	str[k] = '\0';
	strcpy(s, str);
}
void coding(HuffmanCode &HC, char  str[], char get[]){
	int i, j = 0;
	while (str[j] != '\0'){
		for (i = 1; i <= num; i++){
			if (HC[i].ch == str[j]){
				strcat(get, HC[i].bits);
				break;
			}
		}
		j++;
	}
	strcat(get,"\0");
	int len =sizeof(get)/sizeof(get[0]);
}

void init(){
	int i;
	ifstream infile;
	infile.open("ToBeTrain.txt");
	i=0;
	if(infile){
		while(!infile.eof()){
			infile>>st[i++];
		}
	}
	i--;
	i=0;
} 
void dealwith(){
	ofstream out;
	out.open("CodeFile.txt");
	out<<get;
	out.close();
}
int main(){
	char str[257];
	int cn[257];
	HuffmanTree HT;
	HuffmanCode HC;
	char sresult[10000];
	get[0] ='\0';
	int i;
	char mn;
	cout<<"输入0读取屏幕中的字符串,输入I对文件内容进行初始化,输入E对内容进行编码,输入D对内容进行解码."<<"请输入:"<<endl;
	cin>>mn;
	while(mn!='Q'){
		switch(mn){
			case '0':
			printf("please输入要编码的字符串:\n");
			scanf("%s", &st);
			num = countAsc(st, cn, str);
			str[num + 1] = '\0';
			createHuffmanTree(HT, HC, cn, str);
			break;
			case 'I':
			init();
			num = countAsc(st, cn, str);
			str[num + 1] = '\0';
			createHuffmanTree(HT, HC, cn, str);
			break;
			case 'E':
			huffmanencoding(HT, HC);
			printf("共有%d种符号\n", num);
			for (int i = 1; i <= num; i++){
				printf("字符%c次数为%d,编码为%s\n", HC[i].ch, cn[i], HC[i].bits);
			}
			coding(HC, st, get);
			printf("哈夫曼编码为\n%s\n",get);	
			dealwith();
			printf("编码后结果已存储在CodeFile.txt中\n");
			break;
			case 'D':
			decode(HC, sresult);
			printf("译码得:%s\n", sresult);
			break;
		}
		cin>>mn;
	}
}

单源最短路径

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;

const int INF=0x3f3f3f3f;// 正无穷 
const int Maxsize=1e3+5;// 顶点数 
int e[Maxsize][Maxsize];// 邻接矩阵 
int book[Maxsize];// 标记 
int dis[Maxsize];// 距离表 
int n,m;// n:节点;m:边 
int v1,v2,w;

int main()
{
    scanf("%d%d",&n,&m);
    // 初始化邻接矩阵 
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=n;j++)
        {
            if(i==j)e[i][j]=0;
            else e[i][j]=INF;
        }
    }
    // input vex,arc 
    for(int i=1;i<=m;i++)
    {
        scanf("%d%d%d",&v1,&v2,&w);
        e[v1][v2]=w;
    }
    // init dis
    for(int i=1;i<=n;i++)
    {
        dis[i]=e[1][i];
    }
    // init book
    for(int i=1;i<=n;i++)book[i]=0;
    book[1]=1;// 程序以源点为 1来举例 
    
    for(int i=1;i<=n-1;i++)// n-1次循环,而非n次循环(因为 1节点自身已确定) 
    {
        // 找到距离1号顶点最近的顶点(min_index) 
        int min_num=INF;
        int min_index=0;
        for(int k=1;k<=n;k++)// n次循环 
        {
            if(min_num>dis[k] && book[k]==0)
            {
                min_num=dis[k];
                min_index=k;
            }
        }
        book[min_index]=1;// 标记 
        for(int j=1;j<=n;j++)
        {
            // 节点 min__index =》j 有边 
            if(e[min_index][j]<INF)
            {
                // 加入之后使得距离变得更短
                // 可以写为 dis[j]=min(dis[j],dis[min_index]+e[min_index][j]); 
                if(dis[j]>dis[min_index]+e[min_index][j])
                {
                    dis[j]=dis[min_index]+e[min_index][j];
                }
            }
        }
    }
    // print
    for(int i=1;i<=n;i++)
    {
        printf("%d ",dis[i]);
    }
    puts("");// 换行 
}

prim算法

#include<cstdio>
#include<iostream>
using namespace std;
const int maxSize = 1000;
const int INF = 2147483647;
int n, m, G[maxSize][maxSize];
int d[maxSize];
bool vis[maxSize] = {false};
int prim(){
	fill(d, d + maxSize, INF);
	d[0] = 0;
	int ans = 0;
	for(int i = 0; i < n; i++){
		int u = -1, min = INF;
		for(int j = 0; j < n; j++){
			if(vis[j] == false && d[j] < min){
				u = j;
				min = d[j];
			}
		}
		if(u == -1) return -1;
		vis[u] = true;
		ans += d[u];
		for(int v = 0; v < n; v++){
			if(vis[v] == false && G[u][v] != INF && G[u][v] < d[v]){
				d[v] = G[u][v];
			}
		}
	}	
	return ans;
}
int main(void){
	int u, v, w;
	cin>>n>>m;
	fill(G[0], G[0] + maxSize * maxSize, INF);
	for(int i = 0; i < m; i++){
		cin>>u>>v>>w;
		G[u][v] = G[v][u] = w;
	}
	int ans = prim();
	cout<<ans<<endl; 
	for(int i = 0; i < n; ++i){
		cout << d[i] << " ";
	}
	cout << endl;
}

 kruskal

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int n,m,tot=0,k=0;//n端点总数,m边数,tot记录最终答案,k已经连接了多少边 
int fat[200010];//记录集体老大 
struct node
{
	int from,to,dis;//结构体储存边 
}edge[200010];
bool cmp(const node &a,const node &b)//sort排序(当然你也可以快排) 
{
	return a.dis<b.dis;
}
int father(int x)//找集体老大,并查集的一部分 
{
	if(fat[x]!=x)
	return father(fat[x]);
	else return x;
}
void unionn(int x,int y)//加入团体,并查集的一部分 
{
	fat[father(y)]=father(x);
}
int main()
{
	scanf("%d%d",&n,&m);//输入点数,边数 
	for(int i=1;i<=m;i++)
	{
		scanf("%d%d%d",&edge[i].from,&edge[i].to,&edge[i].dis);//输入边的信息 
	}
	for(int i=1;i<=n;i++) fat[i]=i;//自己最开始就是自己的老大 (初始化) 
	sort(edge+1,edge+1+m,cmp);//按权值排序(kruskal的体现) 
	for(int i=1;i<=m;i++)//从小到大遍历 
	{
		if(k==n-1) break;//n个点需要n-1条边连接 
		if(father(edge[i].from)!=father(edge[i].to))//假如不在一个团体 
		{
			unionn(edge[i].from,edge[i].to);//加入 
			tot+=edge[i].dis;//记录边权 
			k++;//已连接边数+1 
		}
	}
	printf("%d",tot);
	return 0;
}

删数问题

#include <iostream>
using namespace std;
int s[1000];
void del(int s[],int x,int y){
	for(int j=x;j<y;j++){
		s[j]=s[j+1];
	}
} 
int findmax(int s[],int l){
	char max=s[0];
	int t;
	for(int i=1;i<=l;i++){
		if(s[i]>max){
			max=s[i];
			t=i;	
		}
	}
	return t;
}
int main(){
	int k; 
	int n;
	string str;
	cin>>str;
	n=str.length();
	for(int i=0;i<n;i++){
		s[i]=str[i]-'0';
	}
	cin>>k;
	int l=n;
	int m=l-k;
	int t,j;
	for(int i=0;i<k;i++){
		t=0;
		j=0;
		while(1){
			if(s[j]>s[j+1]){
				del(s,j,l); 
				l--;
				t=1;
			}
			if(t==1)break;
			if(j==l)break;
			j++;
		}
		if(t==0){
			int z=findmax(s,l);
			del(s,z,l);
			l--;
		}
	}
	if(s[0]==0);
	else cout<<s[0];
	for(int i=1;i<m;i++){
		cout<<s[i];
	}
}

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐