Educational Codeforces Round 93 (Rated for Div. 2)
题意,给你一个非递减的数组,问你里面有没有不能构成三角形的边,如果存在则输出,否则输出-1;
思路:非递减,说明刚开始两个加一块是最小的,如果后面存在比他们的和大的就肯定有三条边构不成三角形了,如果后面的比他们的和都要小,说明这个数组里面任意三条边都能构成三角形。
#include<bits/stdc++.h> #include<map> const int N=5e4+10; using namespace std; int main() { int t; cin>>t; while(t--) { int n; cin>>n; long long a[N]; for(int i=0; i<n; i++) cin>>a[i]; long long ans=a[0]+a[1]; int fla=0; int lo=0; for(int i=2; i<n; i++) { if(ans<=a[i]) { fla=1; lo=i; break; } } if(fla==1) cout<<"1"<<" "<<"2"<<" "<<lo+1<<endl; else cout<<"-1"<<endl; } return 0; }
题意:两个人玩游戏,每次去掉一串1,每次得分是每次去掉的串中1的个数,问先手最多能获得的多少分。
思路:统计一下每个都是1的串里面含有1的个数,然后压入优先队列,(刚开始用的sort排序T掉了...)然后在从队列中取出来,在隔一次加一次就行了。
#include<bits/stdc++.h> #include<map> #include<queue> const int N=100000+10; using namespace std; int main() { int t; cin>>t; priority_queue<int> q; while(t--){ string s; cin>>s; int ans=0; int j; for( j=0; j<s.size(); j++){ if(s[j]=='0') continue; else break; } for(int i=j; i<s.size(); i++) { if(s[i]=='0'){ q.push(ans); ans=0; } else if(s[i]=='1'){ ans++; } } if(ans!=0) q.push(ans); int sum=0; int flage=1; while(!q.empty()){ int s=q.top(); q.pop(); if(flage%2==1) sum+=s; flage++; } cout<<sum<<endl; } return 0; }