Codeforces Round #802 (Div. 2)题解
:
A题:A. Optimal Path
求最短路径长度
思路:
一道水题,直接上代码
AC代码:
#include <iostream> using namespace std; typedef long long ll; int main(){ ll t,a,b,ans; cin>>t; while(t--){ cin>>a>>b; ans=(1+b-1)*(b-1)/2+(b+a*b)*a/2; cout<<ans<<endl; } return 0; }
B题:B. Palindromic Numbers
给一个长数字a,求出另一个长度相等的数字b,使a+b的结果为一个回文字符串。
思路:
如果给出的数字第一位不为9,我们就让相加后的串为长度为的全9串。
如果第一位为9,就令相加后的串为长度为的全1串.然后做个高精度减法即可。
高精度减法用的ACwing的模板,注意套模板之前要用reverse函数翻转一下。
AC代码:
#include <iostream> #include <bits/stdc++.h> using namespace std; typedef long long ll; vector<int> sub(vector<int>&A,vector<int>&B){ vector<int> c; for(int i=0,t=0;i<A.size();i++){ t=A[i]-t; if(i<B.size()) t-=B[i]; c.push_back((t+10)%10); if(t<0) t=1; else t=0; } while(c.size()>1&&c.back()==0) c.pop_back(); return c; } vector<int> a,b,c; vector<int>::iterator it; string str; int main(){ int t,n,temp; scanf("%d",&t); while(t--){ a.clear(); b.clear(); c.clear(); cin>>n; cin>>str; for(int i=0;i<n;i++){ temp=str[i]-0; a.push_back(temp); } if(str[0]==9) { for(int i=0;i<=n;i++){ b.push_back(1); } } else{ for(int i=0;i<n;i++){ b.push_back(9); } } reverse(a.begin(),a.end()); c=sub(b,a); reverse(c.begin(),c.end()); for(int i=0;i<n;i++){ printf("%d",c[i]); } printf(" "); } return 0; }
C题:C. Helping the Nature
题意:
思路:
经典差分题,只要想清楚了就很简单;
思路如下所示:
AC代码:
#include <bits/stdc++.h> using namespace std; int arr[200005]; int brr[200005]; typedef long long ll; int main(){ ll t,n; scanf("%lld",&t); while(t--){ memset(arr,0,sizeof(arr)); memset(brr,0,sizeof(brr)); scanf("%lld",&n); for(int i=0;i<n;i++){ scanf("%lld",&arr[i]); } for(int i=1;i<n;i++){ brr[i]=arr[i]-arr[i-1]; } brr[0]=arr[0]; ll ans=0,star=arr[0]; for(int i=1;i<n;i++){ if(brr[i]<0) star=star+brr[i],ans=ans-brr[i]; else ans=ans+brr[i]; } if(star<=0) cout<<ans-star<<endl; else cout<<ans+star<<endl; } }
D题:D. River Locks
题意:
思路:
AC代码:
待补充ing....