Codeforces Round #530 (Div. 2)
作者:互联网
A. Snowball
正常模拟一遍就行了,注意的是每次碰到时候可能变为负值,这时候重量要置0,然后再继续往下模拟;
#include <bits/stdc++.h> using namespace std; const int maxn=1e5+10; typedef long long ll; int main(){ int w,h,a,b,c,d; cin>>w>>h>>a>>b>>c>>d; int sum=w; for(int i=h;i>=0;i--){ if(sum<0)sum=0; sum+=i; if(i==b)sum-=a; if(i==d)sum-=c; //cout<<sum<<endl; } if(sum<=0)cout<<0<<endl; else cout<<sum<<endl; return 0; }View Code
B. Squares and Segments
队友用的是贪心,我找规律。。都行把~写出前10个的图形就可以发现规律;(不懂描述规律的弱鸡)
#include <bits/stdc++.h> using namespace std; const int maxn=1e5+10; typedef long long ll; int main(){ int n; cin>>n; int flag=0; int i=0; int k=1; int cnt=2; while(i+k<n){ i+=k; flag++; cnt++; if(flag==2){ k++; flag=0; } } cout<<cnt<<endl; //else cout<<cnt+1<<endl; return 0; }View Code
C. Postcard
模拟字符串:注意的是Impossible的情况:1.因为*和?都只能删除一个字母,所以都删除之后还大于题目要求的个数;
2.当字母少于题目要求的数量并且没有*(没有能增加字母的情况);
#include <bits/stdc++.h> using namespace std; const int maxn=1e5+10; typedef long long ll; int main(){ string s; int n; cin>>s>>n; int len=s.size(); int cnt=0,cnt1=0,cnt2=0; for(int i=0;i<len;i++){ if(s[i]>='a'&&s[i]<='z')cnt++; else if(s[i]=='*')cnt1++; else cnt2++; } if(cnt-cnt1-cnt2>n||cnt==0||(cnt<n&&len-cnt==cnt2)){ cout<<"Impossible"<<endl; return 0; } n-=cnt; //cout<<n<<endl; for(int i=0;i<len;i++){ if(n<0){ if(s[i+1]=='*'||s[i+1]=='?'){ n++; continue; } } else if(n>0){ if(s[i]=='*'){ for(int j=n;j>0;j--) cout<<s[i-1]; n=0; continue; } } if(s[i]>='a'&&s[i]<='z')cout<<s[i]; } cout<<endl; return 0; }View Code
D. Sum in the tree
题意:给你一棵树,每个节点都对应一个值(但是未知),已知的是每个节点到根节点的路径和(就是这条路径上所有节点的和,-1代表未知),求最小的每个节点的和;
反向建图,v1=s1已知,子节点的和一定大于父节点,如果遇到-1时,就选择他所有连接的父节点的最小值来当作当前节点到根节点的路径和,此时的vi=s[i]-s[par[i]];
#include <bits/stdc++.h> using namespace std; typedef long long ll; const int inf=0x3f3f3f3f; const int maxn=1e5+10; vector<int>g[maxn]; int v[maxn]; int par[maxn]; int s[maxn]; int main(){ int n; cin>>n; for(int i=2;i<=n;i++){ int x; cin>>x; g[x].push_back(i); par[i]=x; } for(int i=1;i<=n;i++){ cin>>s[i]; } ll ans=0; for(int i=1;i<=n;i++){ if(i==1)v[i]=s[i]; else{ if(s[i]==-1){ s[i]=inf; for(int j=0;j<g[i].size();j++) s[i]=min(s[g[i][j]],s[i]); v[i]=s[i]-s[par[i]]; if(g[i].size()==0)v[i]=0; } else{ v[i]=s[i]-s[par[i]]; } if(v[i]<0){ cout<<"-1"<<endl; return 0; } } ans+=v[i]; } cout<<ans<<endl; return 0; }View Code
标签:const,int,ll,Codeforces,long,maxn,530,Div,节点 来源: https://www.cnblogs.com/lin1874/p/11294022.html