二分与贪心
E题(贪个够吧)
经典的事件序列贪心
第一遍是WA的
#include<stdio.h>
#include<algorithm>
using namespace std;
struct node
{
int open;
int to;
} a[200];
int cmp(node x,node y)
{
return x.to<y.to;
}
int main()
{
int n;
while(scanf("%d",&n))
{
if(n==0)
break;
for(int i=1; i<=n; i++)
{
scanf("%d %d",&a[i].open,&a[i].to);
}
sort(a+1,a+1+n,cmp);
// for(int i=1; i<=n-1; i++)
// {
//
// cout<<a[i].to<<" ";
// }
int ans=1;
int j=1;
for(int i=2; i<=n-1; i++)
{
if(a[i].open>=a[j].to)
{
ans++;
j = i;
}
}
printf("%d\n",ans);
}
return 0;
}
其实不小心是把n
写成n-1
因此
AC code
#include<stdio.h>
#include<algorithm>
using namespace std;
struct node
{
int open;
int to;
} a[200];
int cmp(node x,node y)
{
return x.to<y.to;
}
int main()
{
int n;
while(scanf("%d", &n)!= EOF)
{
if(n==0)
break;
for(int i=1; i<=n; i++)
{
scanf("%d %d",&a[i].open,&a[i].to);
}
sort(a+1,a+1+n,cmp);
int ans=1;
int j=1;
int last =a[1].to;
for(int i=2; i<=n; i++)
{
if(a[i].open>=last)
{
ans++;
last =a[i].to;
}
}
printf("%d\n",ans);
}
return 0;
}
A题(二分答案)
WA
#include<stdio.h>
#include<iostream>
#include<algorithm>
using namespace std;
int a[100005];
int n,c;
int x;
bool check(int m)
{
int st;
int sum=0;
st=-2e5;
for(int i=1;i<=n;i++)
{
if(a[i]-st>=m)
{
sum++;
// cout<<m<<" "<<sum<<endl;
st=a[i];
}
}
if(sum>=c)
{
return true;
}
else
return false;
}
int cows()
{
int l =1,r=x;
int ans=0;
while(l<=r)
{
int mid =(l+r)/2;
if(check(mid)==true)
{
ans=mid;
// cout<<ans<<" *****************"<<l<<" "<<r<<endl;
l=mid+1;
}
else
r=mid-1;
}
return ans;
}
int main()
{
scanf("%d%d", &n,&c);
x=0;
for(int i=1; i<=n; i++)
{
scanf("%d",&a[i]);
x =max(x,a[i]);
}
sort(a+1,a+1+n);
int len =cows();
printf("%d\n",len);
return 0;
}
AC code
#include<stdio.h>
#include<iostream>
#include<algorithm>
using namespace std;
int n,c;
int a[100005];
int x;
bool check(int mid)
{
int st =-2e9;
int sum=0;
for(int i=1; i<=n; i++)
{
if(a[i]-st>=mid)
{
sum++;
st=a[i];
}
}
if(sum>=c)
return true;
else
return false;
}
int binary()
{
int ans;
int mid;
int l =1,r=x;
while(l<=r)
{
mid =(l+r)>>1;
if( check(mid))
{
ans =mid;
l =mid+1;
}
else
r=mid-1;
}
return ans;
}
int main()
{
scanf("%d%d",&n,&c);
x=0;
for(int i=1; i<=n; i++)
{
scanf("%d",&a[i]);
x= max(a[i],x);
}
sort(a+1,a+1+n);
int den = binary();
printf("%d\n",den);
return 0;
}
技巧题(获取重复元素)G
題目
获取重复元素
- 用bool vel[ ]来标记
- 用set去重,计数检验
bool 数组:
#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<set>
#include<string.h>
using namespace std;
set<int>s1;
bool ans[1100];
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
// s1.clear();
memset(ans,false,sizeof(ans));
int n,m;
scanf("%d %d",&n,&m);
int oo;
for(int i=1; i<=n; i++)
{
int x;
scanf("%d",&x);
ans[x]=true;
}
// int s1s =s1.size();
bool f=false;
for(int j=1; j<=m; j++)
{
int y;
scanf("%d",&y);
if(ans[y]==true)
{
oo=y;
f=true;
}
}
if(f==true)
printf("YES\n1 %d\n",oo);
else
printf("NO\n");
}
return 0;
}
set去重:
#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<set>
using namespace std;
set<int>s1;
set<int>s2;
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
s1.clear();
s2.clear();
int n,m;
scanf("%d %d",&n,&m);
int ans;
for(int i=1; i<=n; i++)
{
int x;
scanf("%d",&x);
s1.insert(x);
}
int s1s =s1.size();
int s2s =s2.size();
bool f=false;
for(int j=1; j<=m; j++)
{
int y;
scanf("%d",&y);
s1.insert(y);
s2.insert(y);
if(s1.size()==s1s&&f==false&&s2.size()!=s2s)
{
ans=y;
f=true;
}
s1s =s1.size();
s2s =s2.size();
}
if(f==true)
printf("YES\n1 %d\n",ans);
else
printf("NO\n");
}
return 0;
}