2020.04.22【NOIP普及组】模拟赛C组28

比赛 专栏收录该内容
42 篇文章 0 订阅

链接·

T1:

简单

var
i,j,k,m,n,x,y,g,f:longint;
a:array['A'..'Z']of char;
b:array['A'..'Z']of longint;
s,s1,s2,ss:ansistring;
begin
    assign(input,'spy.in');
    assign(output,'spy.out');
    reset(input);
    rewrite(output);
    readln(s);
    readln(s1);
    readln(s2);
    fillchar(a,sizeof(a),' ');
    for i:=1 to length(s) do
    begin
        if a[s[i]]=' ' then a[s[i]]:=s1[i];
        if a[s[i]]<>s1[i] then begin x:=1;break; end;
    end;
    for i:=65 to ord('Z') do
    if a[chr(i)]<>'' then
    begin
        inc(b[a[chr(i)]]);
        if b[a[chr(i)]]=2 then begin x:=1;break; end;
    end;
    if x=1 then begin write('Failed');exit; end;
    for i:=1 to length(s2) do
    begin
        if a[s2[i]]='' then begin x:=1;break; end;
        ss:=ss+a[s2[i]];
    end;
    if x=1 then write('Failed')
    else write(ss);
    close(input);
    close(output);
end.

T2:

如果gcd(a,b)=k,那么gcd(a/k,b/k)=1
然后就知道gcd(b1/b0,b1/x)=1
and gcd(x/a1,a0/a1)=1

#include<iostream>
#include<cstdio>
using namespace std;
int n,m,k,x,y,x1,y1;
int gcd(int a,int b){
	if(b==0)return a;
	else return gcd(b,a%b);
}
int main(){
	freopen("son.in","r",stdin);
	freopen("son.out","w",stdout);
	int t;
	cin>>t;
	while(t--){
		cin>>x>>y>>x1>>y1;
		int a=x/y;
		int b=y1/x1;
		for(int i=1;i*i<=y1;i++){
			if(y1%i==0){
				if(i%y==0&&gcd(i/y,a)==1&&gcd(b,y1/i)==1)m++;
				int j=y1/i;
				if(i==j)continue;
				if(j%y==0&&gcd(j/y,a)==1&&gcd(b,y1/j)==1)m++;
			}
		}
		cout<<m<<endl;
		m=0;
	}
	return 0;
}

T3:

通过SPFA的传递,我们可以把答案用数组存住,然后通过SPFA传递,一次做最小,一次做最大,然后
在这里插入图片描述

#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
int m,n,k,a[100001],maxx[100001],minn[100001],v[100001],f[1000100],ans;
struct node{
	int x,y,next,w;
}xx[1000001];
node yy[1000001];
int tot,tot1,hd1[100001],hd[100001];
void add1(int x,int y,int w){
	tot++;
	xx[tot].x=x;
	xx[tot].y=y;
	xx[tot].w=w;
	xx[tot].next=hd[x];
	hd[x]=tot;
}
void add2(int x,int y,int w){
	tot1++;
	yy[tot1].x=x;
	yy[tot1].y=y;
	yy[tot1].w=w;
	yy[tot1].next=hd1[x];
	hd1[x]=tot1;
}
void spfa(int x){
	memset(minn,0x3f,sizeof(minn));
	minn[x]=a[x];
	v[x]=1;
	f[1]=x;
	int head=0,tail=1;
	while(head!=tail){
		head=head%100010+1; 
		int x1=f[head];
		for(int i=hd[x1];i;i=xx[i].next){
			if(minn[xx[i].y]>min(a[xx[i].y],minn[x1])){
				minn[xx[i].y]=min(a[xx[i].y],minn[x1]);
				if(v[xx[i].y]==0){
					tail++;
					v[xx[i].y]=1;
					f[tail]=xx[i].y;
				}
			}
		}
		v[x1]=0;
	}
}
void spfa1(int x){
	memset(v,0,sizeof(v));
	maxx[x]=a[x];
	v[x]=1;
	f[1]=x;
	int head=0,tail=1;
	while(head!=tail){
		head=head%100010+1; 
		int x1=f[head];
		for(int i=hd1[x1];i;i=yy[i].next){
			if(maxx[yy[i].y]<max(a[yy[i].y],maxx[x1])){
				maxx[yy[i].y]=max(a[yy[i].y],maxx[x1]);
				if(v[yy[i].y]==0){
					 tail++;
					v[yy[i].y]=1;
				  	f[tail]=yy[i].y;
				}  
			}
		}  
		v[x1]=0;
	}
}
int main(){
	freopen("trade.in","r",stdin);
	freopen("trade.out","w",stdout);
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	for(int i=1;i<=m;i++){
		int x,y,k;
		cin>>x>>y>>k;
		if(k==1){
			add1(x,y,a[y]);
			add2(y,x,a[x]);
		}
		else{
			add1(x,y,a[y]);
			add1(y,x,a[x]);
			add2(x,y,a[y]);
			add2(y,x,a[x]);
		}
	}
	spfa(1);
	spfa1(n);
	ans=0;
	for(int i=2;i<n;i++){
		ans=max(ans,maxx[i]-minn[i]);
	}
	cout<<ans;
	return 0;
}

T4:

dfs(代码解释)

#include<cstdio>
#include<iostream>
using namespace std;
int map[10][10]=
{{0,0,0,0,0,0,0,0,0,0},
{0,6,6,6,6,6,6,6,6,6},
{0,6,7,7,7,7,7,7,7,6},
{0,6,7,8,8,8,8,8,7,6},
{0,6,7,8,9,9,9,8,7,6},
{0,6,7,8,9,10,9,8,7,6},
{0,6,7,8,9,9,9,8,7,6},
{0,6,7,8,8,8,8,8,7,6},
{0,6,7,7,7,7,7,7,7,6},
{0,6,6,6,6,6,6,6,6,6}};
int dis[11][11],h[11],l[11],maxx=-1;
int xx,yy,x1,y1;
bool hh[11][11],ll[11][11],a[11][11];
int lzh(int x,int y){
	return(x-1)/3*3+(y+2)/3;//九宫格转换哟
}
void findmin(){ //找最好填的哟
	xx=-1,yy=-1;
	for(int i=1;i<=9;i++)
	if(xx<h[i]&&h[i]<9){
		xx=h[i];
		x1=i;
	}
	for(int i=1;i<=9;i++)
	if(yy<l[i]&&!dis[x1][i]){
		yy=l[i];
		y1=i;
	}
}
int zh(){
	int sum=0;
	for(int i=1;i<=9;i++)
	for(int j=1;j<=9;j++)
	sum+=dis[i][j]*map[i][j];
	return sum;//求和哟
}
void dfs(int r,int c,int cnt){ 
	if(cnt==81){
		maxx=max(maxx,zh());
		return;
	}
	for(int i=1;i<=9;i++){
		if(!hh[r][i]&&!ll[c][i]&&!a[lzh(r,c)][i]){
			cnt++;
			hh[r][i]=1;
			ll[c][i]=1;
			a[lzh(r,c)][i]=1;
			h[r]++;
			l[c]++;
			dis[r][c]=i;
			findmin();
			dfs(x1,y1,cnt);
			dis[r][c]=0;
			cnt--;
			hh[r][i]=0;
			ll[c][i]=0;
			a[lzh(r,c)][i]=0;
			h[r]--;
			l[c]--;//回溯哟(有点八皇后的影子)
		}
	}
}
void input(){
	int tot=0;
	for(int i=1;i<=9;i++){
		for(int j=1;j<=9;j++){
			cin>>dis[i][j];
			if(dis[i][j]){
				tot++;
				h[i]++;
				l[j]++;
				a[lzh(i,j)][dis[i][j]]=1;
				hh[i][dis[i][j]]=1;
				ll[j][dis[i][j]]=1;//记录一下哟
			}
		}
	}
	findmin();//找出第一个最小的哟
	dfs(x1,y1,tot);
}
int main(){
	freopen("sudoku.in","r",stdin);
	freopen("sudoku.out","w",stdout);
	input();
	cout<<maxx;
	return 0;
}
  • 0
    点赞
  • 1
    评论
  • 1
    收藏
  • 打赏
    打赏
  • 扫一扫,分享海报

©️2022 CSDN 皮肤主题:技术黑板 设计师:CSDN官方博客 返回首页

打赏作者

VL—MOESR

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值