题目链接:https://www.nowcoder.com/acm/contest/86#question
一套水题手速比赛,打着玩玩23333
A.数字方阵
论文题,百度了一篇论文,xjb构造一下
代码:
#include<bits/stdc++.h>
using namespace std;
const int MAXN=1005;
int dp[MAXN][MAXN];
int dir[4][2]={{0,1},{1,0},{0,-1},{-1,0}};
int main()
{
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
int r,d=0,x=1,y=0;
memset(dp,0,sizeof(dp));
scanf("%d",&r);
for(int i=1;i<=r;i++)
for(int j=1;j<=r;j++)
{
if(j==r)
dp[i][j]=r*(r-1)+i;
else
dp[i][j]=(i-1)*(r-1)+j;
}
for(int i=1;i<=r;i++)
{
printf("%d",dp[i][1]);
for(int j=2;j<=r;j++)
{
printf(" %d",dp[i][j]);
}
puts("");
}
return 0;
}
B.小马过河
弱智如我直接把垂线求了出来然后求交点
代码:
#include<bits/stdc++.h>
using namespace std;
const double eps=1e-5;
struct Point
{
double x,y;
Point(double _x=0,double _y=0):x(_x),y(_x){}
}p[3];
void solve()
{
scanf("%lf%lf%lf%lf%lf%lf",&p[0].x,&p[0].y,&p[1].x,&p[1].y,&p[2].x,&p[2].y);
if(abs(p[1].x-p[2].x)<eps)
{
printf("%.10lf %.10lf\n",p[1].x,p[0].y);
return ;
}
double A1=p[2].x-p[1].x;
double B1=p[2].y-p[1].y;
double a=-A1*p[0].x-B1*p[0].y;
double A2=p[2].y-p[1].y;
double B2=-(p[2].x-p[1].x);
double b=-A2*p[1].x-B2*p[1].y;
double x=(B1*b/B2-a)/(A1-A2*B1/B2);
double y=(-b-A2*x)/B2;
printf("%.10lf %.10lf\n",x,y);
}
int main()
{
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
int T;
scanf("%d",&T);
while(T--)
{
solve();
}
return 0;
}
C.真真假假
签到题,暴力就行了
代码:
#include<bits/stdc++.h>
using namespace std;
string sv[]={"algorithm", "bitset", "cctype", "cerrno", "clocale", "cmath", "complex", "cstdio", "cstdlib", "cstring", "ctime", "deque", "exception", "fstream", "functional", "limits", "list", "map", "iomanip", "ios", "iosfwd", "iostream", "istream", "ostream", "queue", "set", "sstream", "stack", "stdexcept", "streambuf", "string", "utility", "vector", "cwchar", "cwctype"};
int main()
{
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
string s;
bool flag=false;
cin>>s;
for(auto j:sv)
{
if(j==s) flag=true;
}
if(flag) puts("Qian");
else puts("Kun");
}
return 0;
}
D.虚虚实实
先判断整张图是否联通,然后直接判读是否存在欧拉路就行了
代码:
#include<bits/stdc++.h>
using namespace std;
const int MAXN=35;
const int INF=0x3f3f3f3f;
int dp[MAXN][MAXN];
int in[MAXN];
void init()
{
memset(in,0,sizeof(in));
memset(dp,0x3f,sizeof(dp));
}
int n,m;
void solve()
{
init();
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
dp[i][i]=0;
for(int i=1;i<=m;i++)
{
int u,v;
scanf("%d%d",&u,&v);
dp[u][v]=dp[v][u]=1;
in[u]++;in[v]++;
}
for(int k=1;k<=n;k++)
{
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
dp[i][j]=min(dp[i][j],dp[i][k]+dp[k][j]);
}
}
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(dp[i][j]==INF)
{
puts("Xun");
return ;
}
}
}
int cnt=0;
for(int i=1;i<=n;i++)
{
if(in[i]%2==1)
cnt++;
}
if(cnt==0||cnt==2)
puts("Zhen");
else
puts("Xun");
}
int main()
{
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
int T;
scanf("%d",&T);
while(T--)
{
solve();
}
return 0;
}
E.是是非非
nim博弈
代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MAXN=1e5+58;
ll a[MAXN];
int main()
{
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
int n,q;
ll tot=0;
scanf("%d%d",&n,&q);
for(int i=1;i<=n;i++)
{
scanf("%lld",&a[i]);
tot^=a[i];
}
for(int i=1;i<=q;i++)
{
int x;
ll y;
scanf("%d%lld",&x,&y);
tot^=a[x];
tot^=y;
a[x]=y;
if(tot)
puts("Kan");
else
puts("Li");
}
return 0;
}
F.黑黑白白
sg函数裸题
代码:
#include<bits/stdc++.h>
using namespace std;
const int MAXN=1e4+5;
struct Edge
{
int v,nxt;
}E[MAXN*2];
int head[MAXN],sg[MAXN],tot=0;
void init()
{
tot=0;
memset(head,-1,sizeof(head));
memset(sg,-1,sizeof(sg));
}
void addedge(int u,int v)
{
E[tot].v=v;E[tot].nxt=head[u];head[u]=tot++;
}
int n,r;
void dfs(int x,int f)
{
for(int i=head[x];~i;i=E[i].nxt)
{
int v=E[i].v;
if(v==f) continue;
dfs(v,x);
}
vector<int> tmp;
for(int i=head[x];~i;i=E[i].nxt)
{
int v=E[i].v;
if(v==f) continue;
tmp.push_back(sg[v]);
}
sort(tmp.begin(),tmp.end());
int cnt=0;
for(int i=0;i<tmp.size();i++)
{
if(tmp[i]==cnt) cnt++;
}
sg[x]=cnt;
}
void solve()
{
init();
scanf("%d%d",&n,&r);
for(int i=1;i<n;i++)
{
int u,v;
scanf("%d%d",&u,&v);
addedge(u,v);
addedge(v,u);
}
dfs(r,0);
if(!sg[r]) puts("Dui");
else puts("Gen");
}
int main()
{
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
int T;
scanf("%d",&T);
while(T--)
{
solve();
}
return 0;
}
G.文
暴力就好了
代码:
#include<bits/stdc++.h>
using namespace std;
const int MAXN=1e5+5;
const double eps=1e-6;
struct node
{
string name;
double p;
bool operator < (const node &o)const
{
if(abs(p-o.p)<eps) return name<o.name;
return p>o.p;
}
}p[MAXN];
string ans;
int main()
{
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
int n,m;
scanf("%d%d",&n,&m);
cin>>ans;
for(int i=1;i<=m;i++)
{
string tans;
int cnt=0;
cin>>p[i].name;
cin>>tans;
for(int i=0;i<n;i++)
{
cnt+=(ans[i]==tans[i]);
}
p[i].p=100.0/n*cnt;
}
sort(p+1,p+1+m);
cout<<p[1].name<<endl;
printf("%.2lf\n",p[1].p);
return 0;
}
H.武
直接搜出来所有点的距离然后排序就行了
代码:
#include<bits/stdc++.h>
using namespace std;
const int MAXN=1e5+5;
struct Edge
{
int v,nxt,w;
}E[MAXN*2];
int tot,head[MAXN],dp[MAXN];
void init()
{
tot=0;
memset(head,-1,sizeof(head));
}
void addedge(int u,int v,int w)
{
E[tot].v=v;E[tot].w=w;E[tot].nxt=head[u];head[u]=tot++;
}
void dfs(int x,int f,int dis)
{
dp[x]=dis;
for(int i=head[x];~i;i=E[i].nxt)
{
int v=E[i].v;
if(v==f) continue;
dfs(v,x,dis+E[i].w);
}
}
int main()
{
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
int n,p,k;
init();
scanf("%d%d%d",&n,&p,&k);
for(int i=1;i<n;i++)
{
int u,v,w;
scanf("%d%d%d",&u,&v,&w);
addedge(u,v,w);
addedge(v,u,w);
}
dfs(p,0,0);
sort(dp+1,dp+1+n);
printf("%d\n",dp[k+1]);
return 0;
}
I.艺
离散化然后扫一遍就行了
代码:
#include<bits/stdc++.h>
using namespace std;
const int MAXN=1e5+5;
const int INF=0x3f3f3f3f;
typedef long long ll;
struct node
{
int s,w;
bool operator < (const node &o)const
{
return s<o.s;
}
}A[MAXN],B[MAXN];
int Hash[MAXN*2],tot=0;
int a[MAXN*2],b[MAXN*2];
int getid(int x)
{
int ret=lower_bound(Hash+1,Hash+1+tot,x)-Hash;
return ret;
}
int main()
{
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
int n,m,T;
scanf("%d%d%d",&n,&m,&T);
Hash[++tot]=T;
for(int i=1;i<=n;i++)
{
scanf("%d%d",&A[i].s,&A[i].w);
Hash[++tot]=A[i].s;
}
for(int i=1;i<=m;i++)
{
scanf("%d%d",&B[i].s,&B[i].w);
Hash[++tot]=B[i].s;
}
sort(Hash+1,Hash+1+tot);
tot=unique(Hash+1,Hash+1+tot)-Hash-1;
memset(a,0x3f,sizeof(a));
memset(b,0x3f,sizeof(b));
for(int i=1;i<=n;i++)
{
int id=getid(A[i].s);
a[id]=A[i].w;
}
for(int i=1;i<=m;i++)
{
int id=getid(B[i].s);
b[id]=B[i].w;
}
for(int i=1;i<=tot;i++)
{
if(a[i]==INF)
a[i]=a[i-1];
if(b[i]==INF)
b[i]=b[i-1];
}
T=getid(T);
ll ans=0;
int now=max(0,max(a[1],b[1]));
for(int i=2;i<=T;i++)
{
ans+=1LL*now*(Hash[i]-Hash[i-1]);
now=max(0,max(a[i],b[i]));
}
printf("%lld\n",ans);
return 0;
}
J.美
xjb猜了个结论就过了啊?
代码:
#include<bits/stdc++.h>
using namespace std;
const int MAXN=1e5+5;
typedef long long ll;
int a[MAXN];
bool book[MAXN];
int main()
{
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
ll tot=0;
int n;
scanf("%d",&n);
for(int i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
sort(a,a+n);
int now=0;
book[now]=true;
for(int i=0;i<n-1;i++)
{
int nxt=(now+(n+1)/2)%n;
while(book[nxt]) nxt=(nxt+1)%n;
tot+=abs(a[nxt]-a[now]);
now=nxt;
book[now]=true;
}
tot+=abs(a[now]-a[0]);
printf("%lld\n",tot);
return 0;
}