4.15周二下午训练--东塘407
duanjingxiao · · 个人记录
B2160 病人排队
老年人(年龄 ≥60 岁)比非老年人优先看病。 老年人按年龄从大到小的顺序看病,年龄相同的按登记的先后顺序排序。 非老年人按登记的先后顺序看病。
排序规则弄错了,痛失70
#include<bits/stdc++.h>
using namespace std;
const int N=105;
struct node
{
string s;
int id,x;
}a[N];
bool cmp(node q,node p)
{
if(q.x<60&&p.x<60)
return q.id<p.id;
if(q.x!=p.x)
return q.x>p.x;
return q.id<p.id;
}
int main()
{
int n;
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i].s>>a[i].x;
a[i].id=i;
}
sort(a+1,a+n+1,cmp);
for(int i=1;i<=n;i++)
cout<<a[i].s<<"\n";
return 0;
}
P1806 跑步
这是一个dp的题目。
dp[]的第i个下标表示前i圈的方案总数
#include<bits/stdc++.h>
using namespace std;
const int N=505;
#define int long long
int n;
int dp[N];
signed main()
{
cin>>n;
dp[0]=1;
for(int i=1;i<=n;i++)
for(int j=n;j>=i;j--)
dp[j]+=dp[j-i];
cout<<dp[n]-1;
return 0;
}
P1702 突击考试
从1等级到5等级模拟即可
#include<bits/stdc++.h>
using namespace std;
#define int long long
int a[100005][5],cnt[10];
signed main()
{
int n;
cin>>n;
for(int i=0;i<n;i++)
cin>>a[i][0]>>a[i][1];
for(int i=1;i<=5;i++)
{
int ans=0,x=0;
for(int j=0;j<n;j++)
{
if(a[j][0]==i||a[j][1]==i)
x++;//如果这一排符合条件,排数加一
if(a[j][0]!=i&&a[j][1]!=i||j==n-1)//若x的连续排数一直到最后的课桌的话也要计数,故判断条件有 i==n-1
{
ans=max(ans,x);//更新
x=0;
}
}
cnt[i]=ans;
}
int Max=0,ans=0;
for(int i=1;i<=5;i++)//寻找最大排数及其最小等级
{
if(cnt[i]>Max)
{
ans=i;
Max=cnt[i];
}
}
cout<<Max<<" "<<ans;
return 0;
}