题面链接:Dashboard - Codeforces Round 1027 (Div. 3) - Codeforces
A. Square Year
思路
先看数字能否被开方,如果能输出0 即可
代码
#include<bits/stdc++.h>
using namespace std;#define vcoistnt ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
#define int long long
#define vi vector<int>
#define vb vector<bool>
typedef pair<int,int> pll;void solve(){string s;cin>>s;int x=(s[0]-'0')*1000+(s[1]-'0')*100+(s[2]-'0')*10+(s[3]-'0');int c=sqrtl(x);if(c*c!=x){cout<<"-1\n";}else{cout<<0<<" "<<c<<"\n";}
}
signed main() {vcoistntcout<<fixed<<setprecision(2);int _=1;cin>>_;while(_--) solve();return 0;
}
B. Not Quite a Palindromic String
思路
统计1和0的数量,由于我们要k个好的pair,那么我们需要1 1或者0 0开始消除之后剩下的应该是1的数量=0的数量
代码
#include<bits/stdc++.h>
using namespace std;#define vcoistnt ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
#define int long long
#define vi vector<int>
#define vb vector<bool>
typedef pair<int,int> pll;void solve(){int n,k;cin>>n>>k;string s;cin>>s;s=" "+s;int ct0=0,ct1=0;for(int i=1;i<=n;i++){if(s[i]=='0') ct0++;else ct1++;}int t=(abs(ct1-ct0))/2;k-=t;if(k>=0&&k%2==0){cout<<"YES\n";}else{cout<<"NO\n";}
}
signed main() {vcoistntcout<<fixed<<setprecision(2);int _=1;cin>>_;while(_--) solve();return 0;
}
C. Need More Arrays
思路
贪心,我们只要遇到一个比a[i]大且大超过1的数那么ct++,可以保证这是最优的
代码
#include<bits/stdc++.h>
using namespace std;#define vcoistnt ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
#define int long long
#define vi vector<int>
#define vb vector<bool>
typedef pair<int,int> pll;void solve(){int n;cin>>n;vector<int> a(n+10);for(int i=1;i<=n;i++){cin>>a[i];}int i=1;int ct=0;while(i<=n){int ti=i;while(ti<=n&&a[ti]<=a[i]+1){ti++;}i=ti;ct++;}cout<<ct<<"\n";
}
signed main() {vcoistntcout<<fixed<<setprecision(2);int _=1;cin>>_;while(_--) solve();return 0;
}
D. Come a Little Closer
思路
贪心+模拟,我们贪心地想如果要移动某一点一定是,最上或最下或最左或最右的四个点中的一个,那么我们枚举一下去掉某一点之后的剩下点的答案取最小值即可
ps:其实第一步的贪心可以去掉,我们可以枚举每个点(将此点去掉),用前后信息维护最左右上下的边界来计算
代码
#include<bits/stdc++.h>
using namespace std;#define vcoistnt ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
#define int long long
#define vi vector<int>
#define vb vector<bool>
typedef pair<int,int> pll;const int N=2e5+10;
const int inf=1e18;
const int mod=998244353;struct node{int x,y;
};int cal(vector<node>& tx,int id,int n){ //将id的坐标去掉后的值if(n==1) return 1;int tup=inf,tdown=-1,tl=inf,tr=-1;for(int i=1;i<=n;i++){if(i==id) continue;if(tup>tx[i].x){ //记录最上面tup=tx[i].x;}if(tdown<tx[i].x){ //记录最下面tdown=tx[i].x;}if(tl>tx[i].y){ //记录最左边tl=tx[i].y;}if(tr<tx[i].y){ //记录最右边tr=tx[i].y;}}int h=(tdown-tup+1);int l=(tr-tl+1);if(n<=h*l){return h*l;}else{return h*l+min(h,l);}
}void solve(){int n;cin>>n;vector<node> mon(n+10);int up=1,down=1,left=1,right=1;int tup=inf,tdown=-1,tl=inf,tr=-1;for(int i=1;i<=n;i++){cin>>mon[i].x>>mon[i].y;if(tup>mon[i].x){ //记录最上面的坐标tup=mon[i].x;up=i;}if(tdown<mon[i].x){ //记录最下面的坐标tdown=mon[i].x;down=i;}if(tl>mon[i].y){ //记录最左边的坐标tl=mon[i].y;left=i;}if(tr<mon[i].y){ //记录最右边的坐标tr=mon[i].y;right=i;}}int ans=min(min(cal(mon,up,n),cal(mon,down,n)),min(cal(mon,left,n),cal(mon,right,n)));cout<<ans<<"\n";
}
signed main() {vcoistntcout<<fixed<<setprecision(2);int _=1;cin>>_;while(_--) solve();return 0;
}
E. Kirei Attacks the Estate
思路
树上dp,我们用ans数组来记录答案状态转移方程为
代码
#include<bits/stdc++.h>
using namespace std;#define vcoistnt ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
#define int long long
#define vi vector<int>
#define vb vector<bool>
typedef pair<int,int> pll;void solve(){int n;cin>>n;vector<int> a(n+10);for(int i=1;i<=n;i++){cin>>a[i];}vector<vi> e(n+10);for(int i=1;i<n;i++){int u,v;cin>>u>>v;e[u].push_back(v);e[v].push_back(u);}vi ans(n+10);vi f(n+10); //记录父亲节点auto dfs=[&](auto self,int u,int fa)->void{f[u]=fa;ans[u]=max(1ll*a[u],ans[f[fa]]+a[u]-a[fa]);for(auto v:e[u]){if(v==fa) continue;self(self,v,u);}};dfs(dfs,1,0);for(int i=1;i<=n;i++){cout<<ans[i]<<" \n"[i==n];}}
signed main() {vcoistntcout<<fixed<<setprecision(2);int _=1;cin>>_;while(_--) solve();return 0;
}