C++奥赛一本通刷题记录(贪心)
2017.11.15 By gwj1139177410
书不见了,占坑待填。
An Easy Problem poj2453
//贪心, 将最右边第一个01改成10并将其右边的1都往右移到最低位 #include<iostream> using namespace std; int main(){ unsigned int n, x; while(cin>>n &&n){ x = n&-n; cout<<(n+x+(n^(n+x))/x/4)<<" ";//感受一下来自位运算的恐惧吧 } return 0; }
最大子矩阵 openjudge1768
金银岛 openjudge1797
//金属可分割, 所以直接贪心单位价值最大的优先选 #include<cstdio> #include<algorithm> using namespace std; const int maxn = 10010; int w, s; double ans; struct node{ double n, v; }a[maxn]; bool cmp(node a, node b){ return a.v/a.n>b.v/b.n;} int main(){ int T; scanf("%d", &T); while(T--){ ans = 0; scanf("%d%d", &w,&s); for(int i = 1; i <= s; i++) scanf("%lf%lf", &a[i].n, &a[i].v); sort(a+1,a+s+1,cmp); for(int i = 1; i<=s; i++){ if(w >= a[i].n){ w -= a[i].n; ans += a[i].v; } else { ans += a[i].v/a[i].n*w; break; } } printf("%.2lf ", ans); } return 0; }
装箱问题 openjudge19
Ride to Office openjudge2404
电池的寿命 openjudge2469
寻找平面上的极大点 openjudge2704
最小新整数 openjudge3528
Crossing River openjudge702
接水问题 openjudge15