4.15周二下午训练--东塘407

· · 个人记录

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;
}