hdu2022多校第三场补题

1003Cyber Language

#include<bits/stdc++.h>
using namespace std;
int main()
{
	int t;
	cin>>t;
	getchar();
	string a;
	while(t--)
	{
		getline(cin,a);
		int l=a.length();
		for(int i=0;i<l;i++)
		{
			if(i==0)
			{
				a[i]=a[i]-32;
				cout<<a[i];
			}
			if(a[i]==' ')
			{
				a[i+1]=a[i+1]-32;
				cout<<a[i+1];
			}
		}
		cout<<endl;
	}
}

1009Package Delivery

思路:按照一天最多拿k个物品,先进行结构体排序,再单独对r排序,以从小到大的r作参考,卡在不拿就拿不到的那天进行取物,如果按照这样可以取满k个邮件就ans++,不行的话此时为了最优,采取取离此时最快过期的邮件的方法。

#include<bits/stdc++.h> 
using namespace std;
struct pk{
	int l;
	int r;
}p[1000001];
int t,n,k;
bool cmp(pk w,pk y)
{
	if(w.l!=y.l) return w.l<y.l;
	else return w.r<y.r;
}
int main()
{
	ios::sync_with_stdio(0);
	cin>>t;
	while(t--)
	{
		cin>>n>>k;
		vector<int>o;
		for(int i=0;i<n;i++)
		{
			cin>>p[i].l>>p[i].r;
			o.push_back(p[i].r);
		}
		sort(p,p+n,cmp); 
		sort(o.begin(),o.end());
		o.erase(unique(o.begin(), o.end()), o.end());//“删除 ”序列中所有相邻的重复元素(只保留一个)。
		int sum=0,ans=0;
		priority_queue<int, vector<int>, greater<int> >q;//小顶堆。 
	    for(auto i:o)//遍历. 
		{
			while(sum<n&&p[sum].l<=i)//把小于最小的r的每个l对应的r都放进优先队列里。 
			{
			//	cout<<i<<" : "<<p[sum].r<<endl; 
			    q.push(p[sum++].r);
			}
			int s=0;
			while(q.size()&&q.top()==i)//如果这个时候队列q如果不为空且q.top()和此时正在遍历的r相等。即取当天会过期的邮件。 
			{
				//cout<<i<<" : "<<q.top()<<endl;
				s++;
				q.pop();
				if(s>=k)
				{
					ans++;
					s=0;
				}
			}
			if(s!=0)//此时答案无法凑到k的大小,为了最优,采取取离此时最快过期的邮件的方法。 
			{
				//cout<<s<<endl;
				int f=k-s;
				while(q.size()&&f--)
				{
					//cout<<f<<" : "<<q.top()<<endl;
					q.pop();
				}
				ans++;
			}
		}
		cout<<ans<<endl;
		/*1
		5 5
		2 3
		5 6
		2 4
		1 2
		6 9*/
	}
}

 1012Two Permutations

#include <bits/stdc++.h>
#define ll long long
#define N 10000001
#define mod 998244353
using namespace std;
int t,n,a[N],b[N],s[N],p[N],q[N];
void inline add(int &x, int y) { // 加法取模 
    x+=y;
    if(x>=mod)
    x-=mod;
}
int main()
{ // dp
    ios::sync_with_stdio(0);
    cin>>t;
    while(t--)
   {
        map<ll,int>m[2];
        cin>>n;
        for(int i=1;i<=n;i++)
		{//存每个数在序列p中的位置。 
        cin>>p[i];
	    a[p[i]] = i;
		} 
        for(int i=1;i<=n;i++)
		{//存每个数在序列q中的位置。
        cin>>q[i];
	    b[q[i]]=i;
		}
        for(int i=1;i<=2*n;i++)
        cin>>s[i];
        m[0][0] = 1; 
        for(int i=1;i<=2*n;i++)
		{ //枚举s的每一位. 
          m[i&1].clear();//i为奇数则为1,偶数位为0; 
          int j=a[s[i]];//s[i]在序列p中的位置。 
          int k=b[s[i]];//s[i]在序列q中的位置。 
          if(j>0&&j<=min(i, n))//如果s[i]在p中存在且j不超过序列大小n。 
            add(m[i&1][j],m[i-1&1][j-1]);//动规得出m值。 
          if(i>=k)
            add(m[i&1][i-k],m[i-1&1][i-k]);
    }
        cout<<m[0][n]<<endl;
    }
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值