4 条题解
-
0
通俗易懂,但比赛时没打出来......
#include<bits/stdc++.h> using namespace std; #define int long long struct node{ int t,l,tt; }a[11111]; bool cmp(node x,node y){ return x.t+x.l<y.t+y.l; } signed main(){ int n; cin>>n; for(int i=1;i<=n;i++){ cin>>a[i].t>>a[i].l; } sort(a+1,a+n+1,cmp); int ans=1,k=a[1].l+a[1].t; for(int i=2;i<=n;i++){ if(a[i].t>=k){ k=a[i].l+a[i].t; ans++; } } cout<<ans; } -
0
#include<bits/stdc++.h> using namespace std; #define int long long const int N = 2e5 + 10; struct node{ int st, ed, to; } a[N]; int n, ans = 0; bool cmp(node x, node y){ if(x.to == y.to) return x.st < y.st; else return x.to < y.to; } signed main(){ cin >> n; for(int i = 1; i <= n; i++) cin >> a[i].st >> a[i].ed, a[i].to = a[i].st + a[i].ed; sort(a + 1, a + n + 1, cmp); int t = 0; for(int i = 1; i <= n; i++){ if(t <= a[i].st){ ans++; t = a[i].to; } } cout << ans; return 0; } -
0
#include<bits/stdc++.h> using namespace std; struct node{ int x, y; }a[789166]; bool cmp(node q,node p){ return q.y<p.y; } int main(){ int n;cin>>n; for(int i=1;i<=n;i++){ int t; cin>>a[i].x>>t; a[i].y=t+a[i].x; } sort(a+1,a+n+1,cmp); int t=a[1].y,cnt=1; for(int i=2;i<=n;i++){ if(a[i].x>=t){ cnt++; t=a[i].y; } } cout<<cnt; return 0; } -
0
贪心。
考虑:结束越早,留给后面的时间就越多,就能参加更多的活动。
思路:将结束时间(即)排序,遍历,如果该活动能参加就参加,不能就拉倒。
#include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> using namespace std; int n; struct node{//记录t[i]和l[i] int t,l; }a[10010]; bool cmp(node a,node b){//结束时间早的优先 return a.t+a.l<b.t+b.l; } int main(){ cin>>n; for(int i=1;i<=n;i++){//输入 cin>>a[i].t>>a[i].l; } sort(a+1,a+n+1,cmp);//按结束时间早的排序 int end=a[1].t+a[1].l,ans=1;//总得参加一个吧 //end记录最晚的一项的结束时间 for(int i=2;i<=n;i++){ if(a[i].t>=end){//可以参加,即下一项开始时间比上一项结束时间晚 ans++;//可以参加 end=a[i].l+a[i].t;//这是最晚的结束时间 } } cout<<ans<<endl; return 0; }
- 1
信息
- ID
- 1941
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- 6
- 标签
- 递交数
- 44
- 已通过
- 16
- 上传者