Codeforces Round #536 (Div. 2)(ABCD)

旧城等待, 2023-06-03 13:52 73阅读 0赞

A. Lunar New Year and Cross Counting(水)

题意:找x满足以当前为中心四个角都为x的点;

暴力遍历一下就ok了;

ContractedBlock.gif ExpandedBlockStart.gif

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. const int maxn=1e5+10;
  4. string s[510];
  5. int main(){
  6. int n;
  7. cin>>n;
  8. for(int i=0;i<n;i++)cin>>s[i];
  9. int ans=0;
  10. for(int i=0;i<n;i++){
  11. for(int j=0;j<n;j++){
  12. if(s[i][j]=='X'&&s[i-1][j-1]=='X'&&s[i-1][j+1]=='X'&&s[i+1][j-1]=='X'&&s[i+1][j+1]=='X')ans++;
  13. }
  14. }
  15. cout<<ans<<endl;
  16. return 0;
  17. }

B. Lunar New Year and Food Ordering(模拟)

题意:有n种菜,每个菜有ai盘,价格为ci;m个客人,如果客人点的菜不够上,往价格小的补,如果补不够那么就为0;

解:按价格排序,然后记录价格从小到大的位置,然后判断,如果不够上就从pos里找还能够上的菜,如果每次都从1开始找价格小且能上的菜会超时,

所以要记录一下价格在当前最小且有菜的位置;

ContractedBlock.gif ExpandedBlockStart.gif

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. const int maxn=1e5+10;
  4. typedef long long ll;
  5. struct node{
  6. ll a,c;
  7. int id;
  8. }Q[maxn],T[maxn];
  9. int pos[maxn];
  10. bool cmp(node a,node b){
  11. return a.c<b.c;
  12. }
  13. int main(){
  14. ios::sync_with_stdio(false);
  15. int n,m;
  16. cin>>n>>m;
  17. ll sum=0LL;
  18. for(int i=1;i<=n;i++){
  19. cin>>Q[i].a;
  20. sum+=Q[i].a;
  21. }
  22. for(int i=1;i<=n;i++){
  23. cin>>Q[i].c;
  24. Q[i].id=i;
  25. T[i]=Q[i];
  26. }
  27. sort(T+1,T+n+1,cmp);
  28. for(int i=1;i<=n;i++){
  29. pos[i]=T[i].id;
  30. }
  31. int now=0;
  32. while(m--){
  33. int u,v;
  34. cin>>u>>v;
  35. if(sum<=0){
  36. cout<<0<<endl;
  37. continue;
  38. }
  39. if(Q[u].a>=v){
  40. cout<<1LL*Q[u].c*v<<endl;
  41. sum-=v;
  42. Q[u].a-=v;
  43. }
  44. else{
  45. ll ans=0LL;
  46. ans+=1LL*Q[u].a*Q[u].c;
  47. v-=1LL*Q[u].a;
  48. sum-=Q[u].a;
  49. Q[u].a=0;
  50. while(Q[pos[now]].a==0&&now<=n)now++;
  51. for(int i=now;i<=n;i++){
  52. if(v==0)break;
  53. if(Q[pos[i]].a==0)continue;
  54. if(Q[pos[i]].a>=v){
  55. ans+=1LL*Q[pos[i]].c*v;
  56. sum-=1LL*v;
  57. Q[pos[i]].a-=1LL*v;
  58. v=0;
  59. }
  60. else{
  61. sum-=1LL*Q[pos[i]].a;
  62. ans+=1LL*Q[pos[i]].a*Q[pos[i]].c;
  63. v-=1LL*Q[pos[i]].a;
  64. Q[pos[i]].a=0;
  65. }
  66. }
  67. if(v!=0){
  68. cout<<0<<endl;
  69. }
  70. else cout<<ans<<endl;
  71. }
  72. }
  73. return 0;
  74. }

C. Lunar New Year and Number Division

题意:给偶个数,然后让你组合,每个组最少2个数,然后求每个组的平方和,要求和最小;

解:一个大的配一个小的,然后求平方和;

ContractedBlock.gif ExpandedBlockStart.gif

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. typedef long long ll;
  4. const int maxn=3e5+10;
  5. ll a[maxn];
  6. int main(){
  7. int n;
  8. cin>>n;
  9. for(int i=1;i<=n;i++)cin>>a[i];
  10. sort(a+1,a+n+1);
  11. ll ans=0LL;
  12. for(int i=1;i<=n/2;i++){
  13. ans+=1LL*(a[i]+a[n-i+1])*(a[i]+a[n-i+1]);
  14. }
  15. cout<<ans<<endl;
  16. return 0;
  17. }

D. Lunar New Year and a Wander

题意:给一个连通无向图,从1开始走,走遍全图,输出最小字典序的路径;

解:用优先队列,每走一个点,把所有能走的点都push进来,然后每次输出最小序的那个,直到全输出完;

ContractedBlock.gif ExpandedBlockStart.gif

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. const int maxn=1e5+10;
  4. vector<int>g[maxn];
  5. bool vis[maxn];
  6. priority_queue<int,vector<int>,greater<int>>que;
  7. int main(){
  8. int n,m;
  9. cin>>n>>m;
  10. for(int i=1;i<=m;i++){
  11. int u,v;
  12. cin>>u>>v;
  13. g[u].push_back(v);
  14. g[v].push_back(u);
  15. }
  16. que.push(1);
  17. while(!que.empty()){
  18. int u=que.top();
  19. que.pop();
  20. if(vis[u])continue;
  21. cout<<u<<' ';
  22. vis[u]=true;
  23. for(int i=0;i<g[u].size();i++){
  24. if(!vis[g[u][i]]){
  25. que.push(g[u][i]);
  26. }
  27. }
  28. }
  29. return 0;
  30. }

转载于:https://www.cnblogs.com/lin1874/p/11387271.html

发表评论

表情:
评论列表 (有 0 条评论,73人围观)

还没有评论,来说两句吧...

相关阅读