A. Sea Battle
水题,直接输出2*max(w1,w2)+2*(h1+h2)+4 ;
代码:
#include<bits/stdc++.h>
using namespace std;
#define inf 0x3f3f3f
#define ll long long
const int maxn=1e4+9;
int main(){
ios::sync_with_stdio(0);
cin.tie(0);
ll i,j,k,w1,w2,h1,h2;
cin>>w1>>h1>>w2>>h2;
ll ans=2*max(w1,w2)+2*(h1+h2)+4;
cout<<ans<<endl;
}
B
贪心。ans+=min(a[i],b[i])-u+(mp[u]==0?1:0);
代码:
#include<bits/stdc++.h>
using namespace std;
#define inf 0x3f3f3f3f
#define ll long long
const ll maxn=1e5+9;
ll a[maxn],b[maxn];
map<long long ,int>mp;
int main(){
ios::sync_with_stdio(0);
cin.tie(0);
ll i,j,k,n;
cin>>n;
ll mx_flag=-1,u=0,ans=0;
for(i=0;i<n;i++){
cin>>a[i]>>b[i];
}
for(i=0;i<n;i++){
if(min(a[i],b[i])>=u){
ans+=min(a[i],b[i])-u+(mp[u]==0?1:0);
//cout<<min(a[i],b[i])-u+1<<"sfsafsf"<<u<<endl;;
mp[min(a[i],b[i])]=1;
}//mx_flag=min(a[i],b[i]);
u=max(a[i],b[i]);
}//
cout<<ans<<endl;
}
C. Birthday
贪心,最大的放中间,第(2,4,6,8.....)大放左边,第(3,5,7,9.....)大放右边
代码:
#include<bits/stdc++.h>
using namespace std;
#define inf 0x3f3f3f3f
#define ll long long
const int maxn=1e2+9;
ll a[maxn];
int main(){
ios::sync_with_stdio(0);
cin.tie(0);
ll i,j,k,n;
cin>>n;
for(i=1;i<=n;i++){
cin>>a[i];
}
sort(a+1,a+n+1);
vector<int>p;
p.push_back(0);
for(int i=1;i<n;i++){
p.push_back(a[i]);
}
ll t=n-1;
//cout<<p[3]<<"sf"<<endl;
if(t%2==1){
for(i=1;i<=t;i+=2){
// cout<<123<<endl;
cout<<p[i]<<' ';
}
cout<<a[n]<<' ';
for(i=t-1;i>=2;i-=2){
cout<<p[i]<<' ';
}
}
else{
for(i=1;i<=t-1;i+=2){
cout<<p[i]<<' ';
}
cout<<a[n]<<' ';
for(i=t;i>=2;i-=2){
cout<<p[i]<<' ';
}
}
}
D. Gourmet choice
思路:把所有关系为等号的合并为一个点,再通过大于小于关系构建一个图,最后通过拓扑排序求得所有的评分
代码:
#include<bits/stdc++.h>
using namespace std;
#define inf 0x3f3f3f3f
const int maxn=2e3+9;
char mp[maxn][maxn];
int f[maxn],cnt[maxn],val[maxn],vis[maxn];
vector<int>vec[maxn];
int find(int v){
if(f[v]==v)return v;
return f[v]=find(f[v]),f[v];
}
void merge(int u,int v){
int t1,t2;
t1=find(u);
t2=find(v);
if(t1!=t2){
f[t2]=t1;
}
}
void dfs(int v){
vector<int>d;
for(int i=0;i<vec[v].size();i++){
int t=vec[v][i];
cnt[t]--;
if(cnt[t]==0&&!vis[t]){
vis[t]=1;
val[t]=val[v]+1;
d.push_back(t);
}
}
for(int i=0;i<d.size();i++)dfs(d[i]);
}
int main(){
ios::sync_with_stdio(0);
cin.tie(0);
int i,j,k,n,m;
cin>>n>>m;
for(i=1;i<=n+m;i++)f[i]=i;
for(i=1;i<=n;i++){
for(j=1;j<=m;j++){
cin>>mp[i][j];
if(mp[i][j]=='='){
merge(i,n+j);
}
}
}
for(i=1;i<=n;i++){
for(j=1;j<=m;j++){
if(mp[i][j]=='>'){
vec[find(n+j)].push_back(find(i));
cnt[find(i)]++;
}
else if(mp[i][j]=='<'){
vec[find(i)].push_back(find(n+j));
cnt[find(n+j)]++;
}
}
}
for(i=1;i<=n+m;i++)if(i==find(i)&&cnt[i]==0)val[i]=1;
for(i=1;i<=n+m;i++){
int t=find(i);
if(cnt[t]==0&&!vis[t]){
vis[t]=1;
dfs(t);
}
}
for(i=1;i<=n+m;i++)if(cnt[find(i)]!=0){
cout<<"NO"<<endl;
return 0;
}
cout<<"YES"<<endl;
for(i=1;i<=n;i++)cout<<val[find(i)]<<' ';
cout<<endl;
for(i=1;i<=m;i++)cout<<val[find(n+i)]<<' ';
}
F. Asya And Kittens
这个看到note里数字的颜色很容易想到用幷查集去写,每次把x的祖先放在y的前面,然后递归输出一下就行了,至于为什么,自己思考一下
代码:
#include<bits/stdc++.h>
using namespace std;
#define inf 0x3f3f3f3f
const int maxn=2e5+9;
int f[maxn],cnt[maxn];
vector<int>vec[maxn];
void init(){
for(int i=0;i<maxn;i++)f[i]=i;
}
int find(int v){
if(f[v]==v)return v;
return f[v]=find(f[v]),f[v];
}
void solve(int v){
for(int i=0;i<vec[v].size();i++){
cout<<vec[v][i]<<' ';
solve(vec[v][i]);
}
}
int main(){
ios::sync_with_stdio(0);
cin.tie(0);
int i,j,k,n;
cin>>n;
init();
for(i=1;i<n;i++){
int x,y,t1,t2;
cin>>x>>y;
t1=find(x);
t2=find(y);
if(t1!=t2){
vec[t1].push_back(t2);
cnt[t2]++;
f[t2]=t1;
}
}
for(i=1;i<=n;i++){
if(cnt[i]==0){
cout<<i<<' ';
solve(i);
return 0;
}
}
}