A - Three-Point Shot
题意: 输入两个分数求较低比高多3.
#include<bits/stdc++.h> #define int long long const int maxn=3e5+100; int a[maxn]; using namespace std; signed main() { int n,i,j,t; cin>>i>>j; int m1=min(i,j); if(m1+3>max(i,j)) cout<<"Yes"<<endl; else cout<<"No"<<endl; }
B - Orthogonality
题意:求(A1B1)+…+(AnBn)是不是为0
#include<bits/stdc++.h> #define int long long const int maxn=3e5+100; int a[maxn]; int b[maxn]; using namespace std; signed main() { int sum=0; int n; cin>>n; for(int i=0;i<n;i++){ cin>>a[i]; } for(int i=0;i<n;i++){ cin>>b[i]; } for(int i=0;i<n;i++){ sum+=(a[i]*b[i]); } if(sum==0) cout<<"Yes"<<endl; else cout<<"No"<<endl; }
C - ABC Tournament
题意:给你2^n个数,两两相比,赢了的进下一轮,输了的被淘汰,求最后进入决赛被淘汰的人的位置。
思路:可以发现最后进入决赛的人就是前半边和后半边的最高分,所以比较两个输出分数低的那方。
#include<bits/stdc++.h> using namespace std; int a[65540]; int main() { int i,j,n; cin>>n; int min1=-INT_MAX,min2=-INT_MAX,ans1=0,ans2=0; for(i=1;i<=pow(2,n);i++){ cin>>a[i]; if(i<=((pow(2,n))/2)){ if(a[i]>min1) ans1=i,min1=a[i]; } else { if(a[i]>min2) ans2=i,min2=a[i]; } } if(min1>min2) cout<<ans2<<endl; else cout<<ans1<<endl; }
题意: 可以转化为在所给的区间里,每天活动所要消耗的c,求最小的SUMc,给你一个可以被消耗的Q能用来抵消当天的消耗。
思路:用差分然后放到map里,因为差分数组的前缀和就是当天的值,所以在和Q比较之后取较小的,再乘以几天就可以得到消耗的钱。
#include<bits/stdc++.h> using namespace std; #define ll long long const int maxn = 2e5 + 5; map<int, ll> mp; int main(){ ll i,n, c; cin >> n >> c; for( i = 1; i <= n; i ++){ int x, y, w; cin >> x >> y >> w; mp[x] += w; mp[y + 1] -= w; } ll s = 0, ans = 0; int last = 0; for(auto it : mp){ ll x = min(s, c); ans += x * (it.first - last); s += it.second; last = it.first; } cout << ans << endl; return 0; }