2017湘潭邀请赛

好吧,我有来挖坑了(4/10)

题目链接:https://www.icpc.camp/contests/4mYguiUR8k0GKE


D.Super Resolution


直接算出来每个位置的数字就好了


代码:

#include<bits/stdc++.h>
using namespace std;
const int MAXN=105;
char mp[MAXN][MAXN],out[MAXN][MAXN];
int n,m,a,b;
void solve()
{
	for(int i=0;i<n;i++)
	{
		scanf("%s",mp[i]);
	}
	for(int i=0;i<n;i++)
	{
		for(int j=0;j<m;j++)
		{
			for(int p=i*a;p<(i+1)*a;p++)
			{
				for(int q=j*b;q<(j+1)*b;q++)
				{
					out[p][q]=mp[i][j];
				}
			}
		}
	}
	for(int i=0;i<n*a;i++)
	{
		for(int j=0;j<m*b;j++)
		{
			printf("%c",out[i][j]);
		}
		printf("\n");
	}
}
int main()
{
	//freopen("in.txt","r",stdin);
	//freopen("out.txt","w",stdout);
	while(~scanf("%d%d%d%d",&n,&m,&a,&b))
	{
		solve();
	}
	return 0;
}

E.Partial Sum


弱智选手不会做系列,本质上是选两个前缀和,然后相减取绝对值,直接按照前缀和排序然后贪心选取就好了


代码:

#include<bits/stdc++.h>
using namespace std;
const int MAXN=1e5+5;
typedef long long ll;
int a[MAXN],pre[MAXN];
int n,m,c;
void solve()
{
        for(int i=1;i<=n;i++)
        {
                scanf("%d",&a[i]);
        }
        pre[0]=0;
        for(int i=1;i<=n;i++)
        {
                pre[i]=pre[i-1]+a[i];
        }
        sort(pre,pre+1+n);
        //for(int i=0;i<=n;i++)\
                cout<<pre[i]<<endl;
        ll ans=0;
        for(int i=0;i<m;i++)
        {
                if(pre[n-i]-pre[i]<=c) break;
                ans+=1LL*pre[n-i]-pre[i]-c;
        }
        printf("%lld\n",ans);
}
int main()
{
        //freopen("in.txt","r",stdin);
        //freopen("out.txt","w",stdout);
        while(~scanf("%d%d%d",&n,&m,&c))
        {
                solve();
        }
        return 0;
}

H.Highway


每个点向直径上的两个端点连边即可。


代码:

#include<bits/stdc++.h>
using namespace std;
const int MAXN=1e5+5;
typedef long long ll;
struct edge
{
	int v,nxt,w;
}E[MAXN*2];
int head[MAXN],tot,n;
ll dp[MAXN];
void init()
{
	tot=0;
	memset(dp,0,sizeof(dp));
	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++;
	E[tot].v=u;E[tot].w=w;E[tot].nxt=head[v];head[v]=tot++;
}
int rt;
ll mx;
void dfs(int now,int fa,ll dis)
{
	if(dis>mx)
	{
		rt=now;
		mx=dis;
	}
	for(int i=head[now];~i;i=E[i].nxt)
	{
		int v=E[i].v;
		if(v==fa) continue;
		dfs(v,now,dis+E[i].w);
	}
}
void dfsdis(int now,int fa,ll dis)
{
	dp[now]=max(dp[now],dis);
	for(int i=head[now];~i;i=E[i].nxt)
	{
		int v=E[i].v;
		if(v==fa) continue;
		dfsdis(v,now,dis+E[i].w);
	}
}
void solve()
{
	init();
	for(int i=1;i<n;i++)
	{
		int u,v,w;
		scanf("%d%d%d",&u,&v,&w);
		addedge(u,v,w);
	}
	rt=0;mx=0;
	dfs(1,0,0);
	dfsdis(rt,0,0);
	mx=0;
	dfs(rt,0,0);
	dfsdis(rt,0,0);
	ll ans=0;
	for(int i=1;i<=n;i++)
	{
		if(i==rt) continue;
		ans+=dp[i];
	}
	printf("%lld\n",ans);
}
int main()
{
	//freopen("in.txt","r",stdin);
	//freopen("out.txt","w",stdout);
	while(~scanf("%d",&n))
	{
		solve();
	}
	return 0;
}

I.Strange Optimization


最大值为gcd(n,m)/(2*n*m)


代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main()
{
	//freopen("in.txt","r",stdin);
	//freopen("out.txt","w",stdout);
	int n,m;
	while(~scanf("%d%d",&n,&m))
	{
		ll up,down,gcd;
		up=__gcd(n,m);
		down=2LL*n*m;
		gcd=__gcd(up,down);
		printf("%lld/%lld\n",up/gcd,down/gcd);
	}
	return 0;
}



猜你喜欢

转载自blog.csdn.net/sinat_32872703/article/details/80246846