7 条题解
-
10
这是一道典型的贪心例题。
首先,确定贪心策略
由于笑笑想花最少的钱来买到足够的贺卡,因此我么要优先选单价最便宜的,所以可以把各个贺卡的单价排序,优先选便宜的。(吐槽:笑笑这么穷吗?)
接着,验证贪心策略
不难证明,如果你选存货最多的,那根据样例就能发现错误,输出为:80。而如果选单价最便宜的,那就是正确答案,事实证明,贪心策略就是选单价最便宜的。
最后,就是编码了,先定义一个结构体:
struct T { int x, y; }a[10005];
结构体名字为T是我的习惯(大佬不喜勿喷)
使用这个结构体来存储每个商店贺卡的单价和存货。
再接着就是排序了,直接对结构体的单价sort就行了(注:sort中要加cmp哦):
inline bool cmp(T x, T y) { return x.x < y.x; }
这是cmp的代码
sort(a + 1, a + n + 1, cmp);
这是sort
另外我讲下sort
sort是c++算法库中的一个排序函数,它的作用是把元素按从大到小的顺序排序(注:这是默认情况下),当然,大家也可以自定义sort,比如我此篇题解的代码。至于,我就不讲了。并且此题解中的sort是可以让元素保持联动的。
然后就是贪心了,根据贪心思路可以写出代码,定义一个指针,如果这个商店的贺卡被笑笑买完了,那就去第二便宜的商店买,以此类推(吐槽:商店存货可真少,都会被笑笑买完),直到已经买到了足够的贺卡,那输出答案即可
所以这部分的代码是:
while (m) { if (a[i].y == 0) i++; a[i].y--; ans += a[i].x; m--; }
OK,下面上注释版 :
#include <bits/stdc++.h> using namespace std; struct T { // 定义结构体 int x, y; // x表示单价,y表示存货 }a[10005]; inline bool cmp(T x, T y) { return x.x < y.x; } // 自定义的cmp int main() { ios::sync_with_stdio(false); // 读入加速 cin.tie(0); cout.tie(0); int m, n, ans = 0; cin >> m >> n; for (int i = 1; i <= n; i++) cin >> a[i].x >> a[i].y; // 以上是输入 sort(a + 1, a + n + 1, cmp); // 对结构体排序,下面的贪心会用 // 下面是贪心了,请大家认真看 int i = 1; while (m) { if (a[i].y == 0) i++; a[i].y--; ans += a[i].x; m--; } cout << ans << endl; // 输出答案 return 0; // 好习惯 }
下面是你们最爱的精简无注释版 :
#include <bits/stdc++.h> using namespace std; struct T { int x, y; }a[10005]; inline bool cmp(T x, T y) { return x.x < y.x; } int main() { ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); int m, n, ans = 0; cin >> m >> n; for (int i = 1; i <= n; i++) cin >> a[i].x >> a[i].y; sort(a + 1, a + n + 1, cmp); int i = 1; while (m) { if (a[i].y == 0) i++; a[i].y--; ans += a[i].x; m--; } cout << ans << endl; return 0; }
码风好看吧!
end,撒花
-
3
由于sort正解太简单,所以这里来用 STL 里的
vector
来解决这题。AC 代码( 5ms ):
#include <cstdio> #include <vector> // 向量 #include <algorithm> using namespace std; struct QWQ{ int a , b; }; vector <QWQ> qwq; //声明结构体向量 int m , n , ans; bool cmp(QWQ a , QWQ b){ //比较 return a.a < b.a; } int main(void){ scanf("%d%d" , &m , &n); while(n--){ int a , b; scanf("%d%d" , &a , &b); qwq.push_back((QWQ){a , b}); // 单价与数量加入qwq } sort(qwq.begin() , qwq.end() , cmp); //排序,单价低的排前面 for(int i = 0;i < qwq.size() && m > 0;i++){ //计算价钱,优先去单价低的商店 if(m > qwq[i].b){ ans += qwq[i].a * qwq[i].b; m -= qwq[i].b; } else{ ans += qwq[i].a * m; m = 0; } } printf("%d\n" , ans); }
-
2
sort排序单价,为最便宜的
#include <bits/stdc++.h> using namespace std; struct heka{ int a,b; }; bool cmp(heka x,heka y){ return x.a<y.a; } int main(void){ int m,n,pos=1,sum=0; heka a[1004]; cin>>m>>n; for(int i=1;i<=n;i++) cin>>a[i].a>>a[i].b; sort(a+1,a+n+1,cmp); while(m>0) if(a[pos].b>0){ a[pos].b--; sum+=a[pos].a; m--; } else pos++; cout<<sum; return 0; } //已AC
-
2
有hand就行(5ms)
</span>#include <bits/stdc++.h> using namespace std; struct heka{int dj,chl;}; bool oiiaioiiiai(heka a,heka b){ return a.dj<b.dj; } int m,n,cost;//cost n.花费 heka a[101]; int main(){ cin>>m>>n; for(int i=1;i<=n;i++) cin>>a[i].dj>>a[i].chl; sort(a+1,a+n+1,oiiaioiiiai); int zhizhen=1; while(m!=0){ if(a[zhizhen].chl>0){ cost+=a[zhizhen].dj; a[zhizhen].chl--; m--; }else zhizhen++; }cout<<cost; return 0; }//鸡你太美~
-
0
#include <bits/stdc++.h> using namespace std; int main() { int m,n,a[1050],b[1040],sum=0; cin >> m >> n; for(int i=1;i<=n;i++) { cin >> a[i] >> b[i]; } for(int i=1;i<n;i++) { for(int j=1+i;j<=n;j++) { if(a[i]>a[j]) { int t=a[i]; a[i]=a[j]; a[j]=t; int d=b[i]; b[i]=b[j]; b[j]=d; } } } for(int i=1;i<=n;i++) { for(int j=1;j<=b[i];j++) { sum+=a[i]; m--; if(m==0) { break; } } if(m==0) { break; } } cout << sum << endl; return 0; }
- 1
信息
- ID
- 727
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- 2
- 标签
- 递交数
- 298
- 已通过
- 179
- 上传者