POJ 2287
题意:田忌赛马,两列图给出每匹马速度,求出最佳分配方法,每赢一局+200,输一局-200,平局不改变。
这题是典型的贪心,把两列数放入vector中每次比较最快的马,如T[F]>Q[F],这两匹马直接比,+200,pop顶层数,若T[F]<Q[F],用最慢的马和他比,相等速度比较最慢的马:若T[S]>Q[S],直接比。若T[S]<=Q[S],最小的马与秦王最快的马比,==则不-200.
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<vector>
#include<stack>
using namespace std;
typedef long long ll;
vector<int>a;
vector<int>b;
int main(){
int t;
while(scanf("%d",&t)!=EOF&&t){
a.clear();
b.clear();
int c,d,s=0;
for(int i=0;i<t;i++){
cin>>c;
a.push_back(c);
}
for(int i=0;i<t;i++){
cin>>d;
b.push_back(d);
}
sort(a.begin(),a.begin()+t);
sort(b.begin(),b.begin()+t);
int f=t-1;
while(!a.empty()){
if(a[f]>b[f]){
s+=200;
a.pop_back();
b.pop_back();
}
else if(a[f]<b[f]){
a.erase(a.begin());
b.pop_back();
s-=200;
}
else{
if(a[0]<=b[0]){
if(a[0]<b[0])s-=200;
a.erase(a.begin());
b.pop_back();
}
else{
if(a[0]>b[0]){
a.erase(a.begin());
b.erase(b.begin());
s+=200;
}
}
}
f--;
}
printf("%d\n",s);
}
return 0;
}
poj1230
题意:魔术师穿墙,墙平行于x轴,给出每个墙的x,y坐标,需要确保穿过每一个y轴穿的墙数<=k(给出)
这题卡了巨久,没什么思路最后发现就是对纵轴所有有墙点(总数超过k),找到对右边影响最大的(r-i最大)把它删去即可,典型的贪心。
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
int mp[105];
struct node{
int x1,x2,y1,y2;
}a[105];
int main(){
int t;
cin>>t;
while(t--)
{
memset(a,0,sizeof a);
memset(mp,0,sizeof mp);
int m,n;
scanf("%d%d",&m,&n);
for(int i=0;i<m;i++){
scanf("%d%d%d%d",&a[i].x1,&a[i].y1,&a[i].x2,&a[i].y2);
int l=min(a[i].x1,a[i].x2);
int r=max(a[i].x1,a[i].x2);
for(int j=l;j<=r;j++)
mp[j]++;
}
int ans=0;
for(int i=0;i<=100;i++)
{
if(mp[i]>n)
{
int maxs=0,pos=0;
for(int j=0;j<m;j++)
{
int l=min(a[j].x1,a[j].x2);
int r=max(a[j].x1,a[j].x2);
if(l<=i && r>=i && maxs<=r-i)
{
maxs=r-i;
pos=j;
}
}
int l=min(a[pos].x1,a[pos].x2);
int r=max(a[pos].x1,a[pos].x2);
for(int j=l;j<=r;j++)
mp[j]--;
a[pos].x1=a[pos].x2=-1;
ans++;
i--;
}
}
printf("%d\n",ans);
}
return 0;
}