2020-2021 ACM-ICPC, Asia Seoul Regional Contest
B. Commemorative Dice
C. Dessert Café
E. Imprecise Computer
B. Commemorative Dice
B题签到题,暴力找一遍就好了
#include<bits/stdc++.h> #include<iostream> #include<algorithm> #include<cstring> #include<vector> #define ll long long int #define mem(a,b) memset(a,b,sizeof a) using namespace std; int a[11],b[11]; int main() { for(int i=1;i<=6;i++) { cin>>a[i]; } for(int i=1;i<=6;i++) { cin>>b[i]; } int ans = 0; for(int i=1;i<=6;i++) { for(int j=1;j<=6;j++) { if(a[i]>b[j]) ans++; } } cout<<ans/(__gcd(ans,36))<<"/"<<36/(__gcd(ans,36)); }
C. Dessert Café
题意:给你一棵树,里面有n个点,和n-1条边和边权,还有m个特殊点,如果存在一个候选地点z,其中公寓建筑群的位置使得每个候选地点q(≠p)的d(p,z)<d(q,z),则候选地点p是一个好地方。问这样的点有多少个?
题解:遍历一遍树,找出每两个特殊点之间有多少个点(包括他们自己),但不能重复,所以dfs一遍就好了。
#include<bits/stdc++.h> #include<iostream> #include<algorithm> #include<cstring> #include<vector> #define ll long long int #define mem(a,b) memset(a,b,sizeof a) using namespace std; int a[1001000]; vector<int>g[1000100]; bool vis[1000100]; bool visit[1000100]; int count1 = 0; int dfs(int u) { if(vis[u]) return 0; bool flag=0; vis[u]=1; for(int i=0;i<g[u].size();i++){ if(vis[g[u][i]]) { continue; } if(dfs(g[u][i])&&!flag) { if(!visit[u]) { count1++; } flag=1; } } if(visit[u]||flag) return 1; } int main() { int n,m; cin>>n>>m; for(int i=1;i<=n-1;i++) { int u,v,w; cin>>u>>v>>w; g[u].push_back(v); g[v].push_back(u); } for(int i=1;i<=m;i++) { cin>>a[i]; visit[a[i]] = 1; } count1 = m; dfs(a[1]); cout<<count1<<endl; }
E. Imprecise Computer
题意:就是1-n之间数比大小,只有两个数之间相差大于等于2的时候才可以比较出大小,那么比如1可以大于2,2也可以大于1,都是成立的,现在叫你构造出两个数组,就是1-n之间的全比较,构造出大于i(i=1.2.3....n)的数构成的数组r1,r2,使满组给出的数组d[i]=abs(r1[i]-r2[i]);
题解:给一个波尔类型flag在遇到1时异或一下,但是在遇到的d[i]==2时flag状态必须为1,因为当为2时i和i-1,和i+1都是交换过的,所以必须为1,同时要满足flag最后要为0,并且d[i]必须小于等于2
#include<bits/stdc++.h> #include<iostream> #include<algorithm> #include<cstring> #include<vector> #define ll long long int #define mem(a,b) memset(a,b,sizeof a) using namespace std; int d[1000100]; int main() { int n; cin>>n; for(int i=1;i<=n;i++) { cin>>d[i]; } bool flag = true; int flag1 = 0; for(int i=1;i<=n;i++) { if(d[i]>2) { flag = false; break; } else{ if(d[i]==1) { flag1 = 1 - flag1; } else if(d[i]==2) { if(flag1 == 0) { flag = false; break; } } } } if(flag&&!flag1) { puts("YES"); } else{ puts("NO"); } }