目录
!L1-088 静静的推荐 - 20 - 贪心
1、nb做法一
- 如果成绩达标且pat成绩也达标 这些人不需要考虑批次 全部可以额外录取
- 如果成绩达标 但pat成绩不达标 则这些人在该成绩段的批次内可以被录取
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n,k,lim,res=0;
cin>>n>>k>>lim;
int num[291]={0};
while(n--)
{
int a,b;
cin>>a>>b;
if(a>=175&&b>=lim) res++; //如果这个人两个都达标 则他不管批次 肯定被额外录取
else if(a>=175)
{
num[a]++; //记录批次
if(num[a]<=k) res++; //如果该批次录取没满 则这个人可以录取
}
}
cout<<res;
}
2、贪心 nb map
- 哈希表mp存 mp[分数段]={pat分数1,pat分数2……}
- 每个分数段按pat从小到大排序
- 如果分数段<175 则这人肯定不录取
- 如果分数段≥175 res+=min(批次k,该分数段人数) 因为前面的pat分数小 如果要录取的人最多,则这些人按批次走肯定可以走
- 在k以后,如果该人的pat分数满足标准 则这个人也可以被额外录取
- 比如mp[189]={0,0,89,95} k=2 lim=90
- 前k=2个人可以按批次走 后面的人如果pat成绩>=90 则也可以被录取
- 比如mp[203]={0} k=2 lim=90
- res+=min(k,mp.size())=1
#include <bits/stdc++.h>
#define all(v) (v).begin(),(v).end()
using namespace std;
int main()
{
int n,k,s;
cin>>n>>k>>s;
map<int,vector<int>>mp;
while(n--)
{
int x,y;
cin>>x>>y;
mp[x].push_back(y);
}
for(auto x:mp)
sort(all(x.second));
for(auto x:mp)
{
if(x.first<175) continue;
res+=min(k,(int)x.second.size());
for(int i=k;i<x.second.size();i++)
{
if(x.second[i]>=s)res++;
}
}
cout<<res<<endl;
}
L1-087 机工士姆斯塔迪奥 - 20 - 二维数组标记
1、正向统计
#include <bits/stdc++.h>
using namespace std;
int row[101000],col[101000];
int main()
{
int n,m,q,res=0,cnt1=0,cnt2=0;
cin>>n>>m>>q;
while(q--)
{
int t,x;
cin>>t>>x;
if(t==0&&row[x]==0) res+=m,cnt1++,row[x]=1;
else if(t==1&&col[x]==0) res+=n,cnt2++,col[x]=1;
}
cout<<n*m-res+cnt1*cnt2;
}
2、反向标记法 二维数组
如果开成a[N][N] 则有一个点过不了
#include <bits/stdc++.h>
using namespace std;
const int N=1e4+10;
int main()
{
int n,m,q,res=0;
cin>>n>>m>>q;
int a[n+1][m+1]={0};
while(q--)
{
int t,x;
cin>>t>>x;
if(t==0) for(int i=1;i<=m;i++) a[x][i]=1;
else for(int i=1;i<=n;i++) a[i][x]=1;
}
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
if(a[i][j]==0) res++;
cout<<res;
}
3、二维vector
二维vector初始化 a.resize(n+1,vector<int>(m+1,0));
#include <bits/stdc++.h>
using namespace std;
int n,m,q,res=0;
vector<vector<int>> a;
int main()
{
cin>>n>>m>>q;
a.resize(n+1,vector<int>(m+1,0));
while(q--)
{
int t,x;
cin>>t>>x;
if(t==0) for(int i=1;i<=m;i++) a[x][i]=1;
else for(int i=1;i<=n;i++) a[i][x]=1;
}
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
if(a[i][j]==0) res++;
cout<<res;
}
L1-086 斯德哥尔摩火车上的题 - 15
#include <bits/stdc++.h>
using namespace std;
int main()
{
string s1,s2;
string r1,r2;
cin>>s1>>s2;
for(int i=1;i<s1.size();i++)
{
int a=s1[i]-'0',b=s1[i-1]-'0';
if(a%2==b%2)
{
int t=max(a,b);
r1+=t+'0';
}
}
for(int i=1;i<s2.size();i++)
{
int a=s2[i]-'0',b=s2[i-1]-'0';
if(a%2==b%2)
{
int t=max(a,b);
r2+=t+'0';
}
}
if(r1==r2) cout<<r1;
else cout<<r1<<endl<<r2;
}
L1-085 试试手气 - 15 - 哈希表标记
思路:
ck[6][7] 存6个骰子 1~6点数出现情况
- 首先标记初始6个骰子的点号
- 第一次先让不是6的骰子转为6并标记6 是6的骰子转为5并标记5
- 接着遍历6~1 看哪个没被标记 标记后存入
- 结束k次循环 输出6个骰子情况
#include <bits/stdc++.h>
using namespace std;
int main()
{
int a[6];
int ck[6][7]={0};
for(int i=0;i<6;i++)
{
cin>>a[i];
ck[i][a[i]]++;
}
int k;
cin>>k;
int n=k;
while(k--)
{
for(int i=0;i<6;i++)
{
if(k==n)
if(a[i]!=6) a[i]=6,ck[i][6]++;
else a[i]=5,ck[i][5]++;
else
{
for(int j=6;j>=1;j--)
if(ck[i][j]==0)
{
a[i]=j;
ck[i][j]++;
break;
}
}
}
}
for(int i=0;i<6;i++)
{
if(i!=0) cout<<" ";
cout<<a[i];
}
}
L1-083 谁能进图书馆 - 10 - 巨恶心的分类讨论
#include <bits/stdc++.h>
using namespace std;
int main()
{
int limt,fa,q1,q2;
cin>>limt>>fa>>q1>>q2;
bool f1=true,f2=true,f3=false,f4=false;
if(q1<limt) f1=false;
if(q2<limt) f2=false;
if(q1<limt&&q2>=fa) f3=true;
if(q1>=fa&&q2<limt) f4=true;
cout<<q1;
if((!f1&&!f2)||(q1<limt&&q2<fa)) cout<<"-N ";
else cout<<"-Y ";
cout<<q2;
if((!f1&&!f2)||(q2<limt&&q1<fa)) cout<<"-N"<<endl;
else cout<<"-Y"<<endl;
if(f3)
printf("qing 2 zhao gu hao 1");
else if(f4)
printf("qing 1 zhao gu hao 2");
else if(f1&&f2)
printf("huan ying ru guan");
else if(!f1&&!f2)
printf("zhang da zai lai ba");
else if(!f1&&f2)
printf("2: huan ying ru guan");
else if(!f2&&f1)
printf("1: huan ying ru guan");
}
L1-084 拯救外星人 - 10
#include <bits/stdc++.h>
using namespace std;
int main()
{
int a,b;
cin>>a>>b;
int s=a+b,sum=1;
while(s>1)
{
sum*=s;
s--;
}
cout<<sum;
}