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