题意:给一个方程,求值
#include#define ios ios::sync_with_stdio(false),cin.tie(0),cout.tie(0); typedef long long ll; typedef unsigned long long ull; using namespace std; const int mod=1000000007; const double eps=1e-8; ll f(ll x) { return x*x + 2 * x + 3; } ll t; int main(){ cin>>t; cout< B - Longest Segment 题意:给一些二维平面的点,求两点间的最长距离
#includeC - Happy New Year!#define ios ios::sync_with_stdio(false),cin.tie(0),cout.tie(0); typedef long long ll; typedef unsigned long long ull; using namespace std; const int mod=1000000007; const double eps=1e-8; struct node { double x,y; }no[110]; double dis(double a,double b,double a1,double b1) { return pow((a-a1)*(a-a1) + (b-b1)*(b-b1),0.5); } int main(){ int n; cin>>n; for(int i = 0 ; i < n ; i ++ ) { cin>>no[i].x>>no[i].y; } double ans = 0; for(int i = 0 ; i < n ; i ++ ) { for(int j = i + 1 ; j < n ; j ++ ) { ans = max(ans,dis(no[i].x,no[i].y,no[j].x,no[j].y)); } } printf("%.7lf",ans); return 0; } 题意:一个只能由0和2组成的数,按照大小排列,例如2,20,22,200,202,220,求第n个数的大小
思路:组成的数根据位数长度,是一个公比为2的等比数列,先确定其位置,类似于二进制,将其先算出位数长度,然后确定位于第几位,转化为二进制,接着输出时,将1输出为2即可#includeD - Prefix K-th Max#define ios ios::sync_with_stdio(false),cin.tie(0),cout.tie(0); typedef long long ll; typedef unsigned long long ull; using namespace std; const int mod=1000000007; const double eps=1e-8; ll a[30]; int arr[1000000]; ll P(ll x)//注意正常的pow函数范围是double,会爆掉 { ll ans = 1; for(int i = 1 ; i <= x ; i ++ ) { ans *= 2; } return ans; } int main(){ ll n; cin>>n; a[1] = 1; for(int i = 2 ; i <= 63 ; i ++ ) a[i] = P(i) - 1;//算等比数列前n项和 int idx = 0; for(int i = 1 ; i < 63 ; i ++ ) { if(n >= a[i] && n < a[i+1]) { idx = i;//确认位于哪一层 break; } } ll x = 0;//当前这一层的位置,并将其转化为二进制 if(n == a[idx]) x = n - a[idx - 1] - 1;//如果刚好位于结尾 else x = n - a[idx] - 1;//因为没有第0位,所以对应的二进制减一 int c = 0; while(x){ arr[c] = x % 2; c++; x = x / 2; } string s = ""; for(int i = c - 1 ; i >= 0 ; i -- ) { s += to_string(arr[i]); } cout<<"2"; if(n == a[idx]) for(int i = idx - 1; i > s.size() ; i -- ) cout<<"0"; //处理前面的0 else for(int i = idx; i > s.size() ; i -- ) cout<<"0"; for(int i = 0 ; i < s.size() ; i ++ ) { if(s[i] == '1') cout<<"2"; else cout<<"0"; } return 0; } 题意:给一个长度为n的无序序列,从第k位开始,算前面的序列中第k大的数。
思路:用一个优先队列即可,前k项直接输出队列top即可,从第k+1项开始,如果当前元素大于堆顶,则入队,并将队顶d出,接着输出堆顶,否则小于则不用理会。#includeusing namespace std; typedef long long ll; const int N = 5e5 + 10; int n,k; int a[N]; int main() { priority_queue ,greater > qu;//小在队顶 scanf("%d%d",&n,&k); for(int i = 1 ; i <= k ; i ++ ) scanf("%d",&a[i]),qu.push(a[i]); cout< qu.top()) { qu.push(a[i]); qu.pop(); } cout< 欢迎分享,转载请注明来源:内存溢出
评论列表(0条)