#include<iostream>#include<algorithm>usingnamespace std;constint N =110;structNode{int w, v;}a[N];intread(){int x =0, f =1;char c =getchar();while(c <'0'|| c >'9'){if(c =='-') f =-1;
c =getchar();}while(c >='0'&& c <='9'){
x = x *10+(c -'0');
c =getchar();}return x * f;}boolcmp(Node a, Node b){// 为防止精度问题直接交叉相承return a.v * b.w > a.w * b.v;}intmain(){int n, t;
n =read(), t =read();for(int i =0; i < n;++ i){
a[i].w =read(), a[i].v =read();}sort(a, a + n, cmp);double ans =0;for(int i =0; i < n;++ i){if(t >= a[i].w){
t -= a[i].w;
ans += a[i].v;}else{
ans += t *1.0* a[i].v / a[i].w;break;}}printf("%.2lf", ans);}
P1223 排队接水
注意精读,sum不能是int否则会wa几个点(就算*1.0也没用)
#include<iostream>#include<algorithm>usingnamespace std;constint N =1010;structNode{int time, idx;}a[N];boolcmp(Node u, Node v){return u.time < v.time;}intmain(){int n;
cin >> n;for(int i =1; i <= n;++ i){
cin >> a[i].time;
a[i].idx = i;}sort(a +1, a + n +1, cmp);for(int i =1; i <= n;++ i){
cout << a[i].idx;if(i != n) cout <<' ';}double sum =0;for(int i =1; i <= n -1;++ i){
sum += a[i].time *(n - i);}
cout << endl;printf("%.2lf", sum / n);}
P1803 凌乱的yyy / 线段覆盖
结束越早越好
#include<iostream>#include<algorithm>usingnamespace std;constint N =1e6+10;structNode{int st, ed;}a[N];boolcmp(Node x, Node y){return x.ed < y.ed;}intmain(){int n;
cin >> n;for(int i =1; i <= n;++ i){
cin >> a[i].st >> a[i].ed;}sort(a +1, a + n +1, cmp);int cnt =0;int last =-10;for(int i =1; i <= n;++ i){if(last <= a[i].st){
cnt ++;
last = a[i].ed;}}
cout << cnt;}
P1090 [NOIP2004 提高组] 合并果子 / [USACO06NOV] Fence Repair G
剩下最后一堆是答案
#include<iostream>#include<queue>usingnamespace std;intmain(){
priority_queue<int, vector<int>, greater<int>> que;int n;
cin >> n;for(int i =0; i < n;++ i){int x;
cin >> x;
que.push(x);}int ans =0;while(que.size()>1){int a = que.top(); que.pop();int b = que.top(); que.pop();
ans += a + b;
que.push(a + b);}
cout << ans;}
P3817 小A的糖果
模拟;
贪心过程:每次吃的是两颗中的第二颗(第一颗是模拟必不可少,需特判
#include<iostream>usingnamespace std;typedeflonglong ll;constint N =1e5+10;
ll a[N];intmain(){int n;
ll x;
cin >> n >> x;
ll ans =0;
cin >> a[1];if(a[1]> x){
ans += a[1]- x;
a[1]= x;}for(int i =2; i <= n;++ i){
cin >> a[i];if(a[i]+ a[i -1]> x){
ans += a[i]+ a[i -1]- x;
a[i]= x - a[i -1];}}
cout << ans;}
P1106 删数问题
外层k轮(因为我们知道k个机会肯定要用完),每次删数要么是遇上的第一个比下一个大的或者是最后一位
string.erase(idx, len)
#include<iostream>usingnamespace std;intmain(){
string s;int k;
cin >> s >> k;while(k --){int n =(int)s.size();for(int i =0; i < n;++ i){if(i == n -1|| s[i]> s[i +1]){
s.erase(i,1);break;}}}while(s.size()>1&& s[0]=='0'){
s.erase(0,1);}
cout << s;}
P1478 陶陶摘苹果(升级版)
#include<iostream>#include<algorithm>usingnamespace std;constint N =5e3+10;structNode{int h, w;}a[N];boolcmp(Node u, Node v){return u.w < v.w;}intmain(){int n, s, u, v;
cin >> n >> s >> u >> v;for(int i =0; i < n;++ i){
cin >> a[i].h >> a[i].w;}sort(a, a + n, cmp);int ans =0;for(int i =0; i < n;++ i){if(a[i].h > u + v)continue;if(s >= a[i].w){
ans ++;
s -= a[i].w;}else{break;}}
cout << ans;}
P5019 [NOIP2018 提高组] 铺设道路
草稿纸上模拟发现,每次是先把从最左边开始的一段给填完,后面的可以看成最左边
#include<iostream>usingnamespace std;constint N =1e5+10;int a[N];intmain(){int n;
cin >> n;for(int i =0; i < n;++ i){
cin >> a[i];}int ans = a[0];for(int i =1; i < n;++ i){if(a[i]> a[i -1]){
ans += a[i]- a[i -1];}}
cout << ans;}
P1208 [USACO1.3]混合牛奶 Mixing Milk
#include<iostream>#include<algorithm>usingnamespace std;constint N =5010;structNode{int price, num;}a[N];boolcmp(Node u, Node v){return u.price < v.price;}intmain(){int n, m;
cin >> m >> n;for(int i =0; i < n;++ i){
cin >> a[i].price >> a[i].num;}sort(a, a + n, cmp);int sum =0;for(int i =0; i < n;++ i){if(a[i].num <= m){
sum += a[i].price * a[i].num;
m -= a[i].num;}else{
sum += a[i].price * m;break;}}
cout << sum;}
#include<iostream>#include<algorithm>usingnamespace std;constint N =3e4+10;int a[N];intmain(){int n, m;
cin >> m >> n;for(int i =0; i < n;++ i)
cin >> a[i];sort(a, a + n);int ans =0;for(int l =0, r = n -1; l <= r;){if(l == r){
ans ++;break;}elseif(a[l]+ a[r]<= m){
l ++, r --;
ans ++;}else{
r --;
ans ++;}}
cout << ans;}
P4995 跳跳!
仍然是双指针
#include<iostream>#include<algorithm>usingnamespace std;typedeflonglong ll;constint N =310;int h[N];intmain(){int n;
cin >> n;for(int i =0; i < n;++ i)
cin >> h[i];sort(h, h + n);int l =0, r = n -1;
ll ans =0;bool ok =true;int last =0;while(l <= r){if(ok){
ok =false;
ans +=(h[r]- last)*(h[r]- last);
last = h[r];
r --;}else{
ok =true;
ans +=(h[l]- last)*(h[l]- last);
last = h[l];
l ++;}}
cout << ans;}
P2240 【深基12.例1】部分背包问题#include <iostream>#include <algorithm>using namespace std;const int N = 110;struct Node { int w, v;}a[N];int read() { int x = 0, f = 1; char c = getchar(); while (c < '0' || c > '9') {