2017日照夏令营 day1 t2洛谷P2652 同花顺

xiaoxiao2021-02-28  89

题目大意: 所谓同花顺,就是指一些扑克牌,它们花色相同,并且数字连续。 现在我手里有 n 张扑克牌,但它们可能并不能凑成同花顺。我现在想知道,最少更换其中的多少张牌,我能让这 n 张牌都凑成同花顺?

思路: 1.首先要求最少更换多少张牌,我们可以求最多能留下多少张牌。 2.题中数据可能会有重复的情况,应该先用unique()去重,注意在去重前一定要用sort排序!!!按花色从小到大排序。用unique对结构体去重时应该定义一下。 3.接下来的任务就是找花色相同的序列中最多能留下的牌数了。 从头到尾枚举,这里有一个判断条件为a[j+1].y-a[i].y< n,即tail到head的值要<=n-1,不然跨度大于n是不可能凑成同花顺的.

#include<iostream> #include<cstdio> #include<algorithm> using namespace std; int ans,n,m; struct node{ int x,y; }a[100005]; bool cmp(node a,node b){ if (a.x==b.x) return a.y<b.y; else return a.x<b.x; } bool cmp1(node a,node b){ return a.x==b.x&&a.y==b.y; } int work(int s,int t){ int sum=0; int i,j=s; for ( i=s;i<=t;i++) { while(j<t&&a[j+1].y-a[i].y<n) j++; sum=max(sum,j-i+1); } return sum; } int main(){ cin>>n; for (int i=1;i<=n;i++) scanf("%d%d",&a[i].x,&a[i].y); sort(a+1,a+n+1,cmp); m=unique(a+1,a+n+1,cmp1)-a-1; // for (int i=1;i<=m;i++) // cout<<a[i].x<<" "<<a[i].y<<endl; int j=1,i; for ( i=2;i<=m;i++) if (a[i].x!=a[i-1].x){ ans=max(ans,work(j,i-1)); j=i; } ans=max(ans,work(j,i-1)); cout<<n-ans; return 0; }
转载请注明原文地址: https://www.6miu.com/read-80883.html

最新回复(0)