sgu代码

本文集包含多个经典算法问题的解答,涉及图论、数学、动态规划等,通过具体实例展示了不同算法的应用,如求解图的遍历路径、计算最大权值路径、简化问题等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

101

#include <cstdio>
#include <cstring>
const int MAXD = 10;
const int MAXM = 210;
int N, e;
int h[MAXD], p[MAXD], dgr[MAXD];
int next[MAXM], v[MAXM], vis[MAXM];
int find(int x) {
	return p[x] == x ? x : (p[x] = find(p[x]));
}
void add(int a, int b) {
	v[e] = b;
	next[e] = h[a];
	h[a] = e++;
}
void init() {
	int a, b, x, y;
	e = 0;
	memset(h, -1, sizeof(h));;
	memset(dgr, 0, sizeof(dgr));
	for (int i = 0; i < 7; i++)
		p[i] = i;
	for (int i = 0; i < N; i++) {
		scanf("%d%d", &a, &b);
		dgr[a]++, dgr[b]++;;
		x = find(a), y = find(b);
		if (x != y) p[y] = x;
		add(a, b);
		add(b, a);
	}
}
void printpath(int u) {
	int i;
	for (i = h[u]; i != -1; i = next[i])
		if (!vis[i]) {
			vis[i] = vis[i^1] = 1;
			printpath(v[i]);
			printf("%d %c\n", i/2+1, i%2 ? '+':'-');
		}
}
void solve() {
	int i, num, ok, start;
	num = 0;
	for (i = 0; !dgr[i]; i++);
	start = i;
	ok = 1;
	for (int j = i; j < 7; j++) {
		if (dgr[j]&&find(start) != find(j)){ 
			ok = 0; break;
		}
		if (dgr[j]%2) num++,start = j;
	}
	if (num>2) ok = 0;
	if (!ok) {
		printf("No solution\n");
		return;
	}
	memset(vis, 0, sizeof(vis));
	printpath(start);
}
int main() {
	while (scanf("%d", &N) != EOF) {
		init();
		solve();
	}
	return 0;
}

102

枚举解法

#include <cstdio>
int gcd(int a, int b) {
    if (!b) return a;
    return gcd(b,a%b);
}
int main() {
    int n;
    while (scanf("%d", &n) != EOF) {
        int sum = 1;
        for (int i = 2; i <= n; i++)
            if (gcd(i,n)==1) sum++;
        printf("%d\n",sum);
    }
    return 0;
}

欧拉函数解法

#include <cstdio>
#include <cmath>

int euler(int x) {
    int i, res = x;
    for (i = 2; i < (int)sqrt(x*1.0)+1; i++)
        if (x%i==0) {
            res = res/i*(i-1);
            while(x%i==0) x /= i;
        }
        if (x > 1) res = res/x*(x-1);
    return res;    
}

int main() {
    int n;
    while (scanf("%d", &n) != EOF) {
        printf("%d\n", euler(n));
    }
    return 0;
}


103欧拉路径

/*
    PROBLEM:sgu103
    AUTHER:Rinyo
    MEMO:最短路
*/

#include<cstdio>
#include<cstring>

int n,m,st,ed,INF;
int r[310],c[310],ans[310],dist[310],last[310];
int t[310][2];
int map[310][310];
bool v[310];
int q[30010];

inline int cmin(const int &x,const int &y) {return x<y?x:y;}

void init()
{
    scanf("%d%d%d%d",&st,&ed,&n,&m);
    for (int i=1;i<=n;i++)
    {
        char ch[5];
        scanf("%s%d%d%d",ch,&r[i],&t[i][0],&t[i][1]);
        if (ch[0]=='B') c[i]=0;else c[i]=1;
    }
    for (int i=1;i<=m;i++)
    {
        int x,y,z;
        scanf("%d%d%d",&x,&y,&z);
        map[x][y]=z;map[y][x]=z;
    }
}

void color(int a,int time,int& ca,int& ta)
{
    if (time<r[a]) {ta=r[a];ca=c[a];return;}
    else 
    {
        int temp=(time-r[a])%(t[a][0]+t[a][1]);
        int now=time-temp;
        if (c[a]==1)
        {
            if (temp<t[a][0]) {ca=0;ta=now+t[a][0];return;}
                     else {ca=1;ta=now+t[a][0]+t[a][1];return;}
        }
        else 
        {
            if (temp<t[a][1]) {ca=1;ta=now+t[a][1];return;}
                     else {ca=0;ta=now+t[a][0]+t[a][1];return;}
        }
    }
}

int calctime(int a,int b,int time,int f)
{
    int ca,cb,ta,tb;
    color(a,time,ca,ta);color(b,time,cb,tb);
    if (ca==cb) return time;
    if (ta==tb)
    {
        if (f==0) {return calctime(a,b,ta,1);}
        else if (time<=r[a]||time<=r[b]) return calctime(a,b,ta,1);
        else return INF;
    }
    return cmin(ta,tb);
}

void spfa()
{
    memset(v,false,sizeof(v));
    for (int i=1;i<=n;i++) dist[i]=INF;
    int head=0,tail=1;
    v[st]=true;q[1]=st;dist[st]=0;last[st]=0;
    while (head<tail)
    {
        head++;
        int now=q[head];
        for (int i=1;i<=n;i++)
        {
            if (map[now][i]>0) 
            {
                int temp=calctime(now,i,dist[now],0);
                if (temp>=INF) continue;
                if (temp+map[now][i]<dist[i])
                {
                    dist[i]=temp+map[now][i];
                    last[i]=now;
                    if (!v[i]) {tail++;q[tail]=i;v[i]=true;}
                }
            }
        }
        v[q[head]]=false;
    }
    if (dist[ed]>=INF) {printf("0");return;}
    printf("%d\n",dist[ed]);
    int now=ed,len=0;
    while (now!=0) {len++;ans[len]=now;now=last[now];}
    for (int i=len;i>=2;i--) printf("%d ",ans[i]);
    printf("%d\n",ans[1]);
    return;
}
int main()
{
    freopen("sgu103.in","r",stdin);
    freopen("sgu103.out","w",stdout);
    INF=99999999;
    init();
    spfa();
    return 0;
}


104 dp

#include<stdio.h>
#include<string.h>
 
int main()
{
  int f,v,i,j,k,D[101][101],a[101][101];
  bool t[101][101];
  scanf("%d%d",&f,&v);
  memset(D,0,sizeof(D));
  memset(t,false,sizeof(t));
  for(i=1;i<=f;++i)
    {
      for(j=1;j<=v;++j)
	scanf("%d",&a[i][j]);
      D[i][i]=D[i-1][i-1]+a[i][i];
      t[i][i]=true;
    }
  for(i=1;i<=f;++i)
    {
      for(j=i+1;j<=v;++j)
	{
	  D[i][j]=D[i][j-1];
	  if(D[i-1][j-1]+a[i][j]>D[i][j])
	    {
	      D[i][j]=D[i-1][j-1]+a[i][j];
	      t[i][j]=true;
	    }
	}
    }
  printf("%dn",D[f][v]);
  for(i=f,k=0,j=v;i>0;--i)
    {
      while(t[i][j]==false) j--;
      a[0][k++]=j--;
    }
  while(k--) printf("%d ",a[0][k]);
  putchar('n');
  return 0;
}


105 暴力 TLE

找规律 AC

#include <cstdio>
int main() {
    int n;
    while (scanf("%d", &n) != EOF) {
        int ans = n/3*2;
        if (n%3==2) ans++;
        printf("%d\n", ans);
    }
    return 0;
}




117  PE

#include <cstdio>

int main() {
    int n, m, k, tep;
    while (scanf("%d%d%d", &n, &m, &k) != EOF) {
    int mm = m;
    int cnt = 0;
    while (n--) {
        scanf("%d", &tep);
        int ans = 1;
        while (m) {
            if (m&1) ans = ans*tep%k;
            tep = tep*tep%k;
            m >>= 1;
        }
        if (!ans%k) cnt++;
        m = mm;
    }
    printf("%d\n", cnt);
    }
}






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值