链接·
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;
}