好吧,我有来挖坑了(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; }