WA到不省人事。。。贪心,求不相交区间。
#include<iostream>
#include<string>
#include<cstring>
#include<cmath>
#include<cstdio>
#include<vector>
#include<queue>
#include<map>
#include<stack>
#include<algorithm>
using namespace std;
const int maxn = 210;
struct Seg{
int a,b;
}s[maxn];
int n,cnt;
bool vis[maxn];
void swap(int &a,int &b){
if(a>b){int tmp=a;a=b;b=tmp;}
}
void solve(){
int i,j;
for(i=0;i<n;i++)
if(!vis[i]) break;
if(i==n) return;
cnt++;
vis[i]=true;
for(j=i++;i<n;i++)
if(!vis[i])
if(s[i].a>s[j].b){
j=i;
vis[j]=true;
}
solve();
}
bool cmp(const Seg s1,const Seg s2){
return s1.a<s2.a; //按起点排序,一开始是按终点排序的。。。因为最左边的点是必须取的,所以作为第一个取的点。。我看白书后思维僵化了。。很多东西要灵活应用啊,这题不仅仅是求不相交区间最大数目- -!在含有其他条件的情况下要灵活应变
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("a.in", "r", stdin);
#endif
int t;
cin>>t;
while(t--){
cin>>n;
for(int i=0;i<n;i++){
cin>>s[i].a>>s[i].b;
s[i].a=(s[i].a+1)/2; //这里没想到可以这样处理,看discuss看到的,我果然弱爆了
s[i].b=(s[i].b+1)/2;
swap(s[i].a,s[i].b);
}
memset(vis,false,sizeof(vis));
sort(s,s+n,cmp);
cnt=0;
solve();
cout<<cnt*10<<endl;
}
return 0;
}
1854



被折叠的 条评论
为什么被折叠?



