题意:
给出t个一行的字符串,输出每个字符串的每个单词的首字母的大写形式。
思路:
用getline输入一行字符串,记住在输出字符串之前加一个getchar。
遍历字符串,当碰到句首字母或者前一个是空格时,再看第i个字母是不是大写,如果不是,就转化为大写,输出这个字符。
代码:
(1)用的是scanf输入t,因为getline对换行符及其敏感,因此在用scanf输入t之后用getchar吸收掉换行符。
#include
using namespace std;
typedef long long ll;
inline void solve(){
string s;
getline(cin,s);
for(int i=0;i='a'&&s[i]<='z'){
s[i]=s[i]-32;
}
cout< (2)
情景:
getline()用来读取一行数据,但是当getline()前面进行了cin输入的话,getline()会把进行cin输入时行末丢弃的换行符读入,从而造成getline()第一次获得的数据为一空行。
问题:
此时getline()所读入的第一行是空行,并且占据一次读入次数,造成只能再输入rep-1次数据。
解决办法:
cin.ignore();
#include
using namespace std;
typedef long long ll;
inline void solve(){
string s;
getline(cin,s);
for(int i=0;i='a'&&s[i]<='z'){
s[i]=s[i]-32;
}
cout<>t;
cin.ignore();
while(t--){
solve();
}
return 0;
}
题意:
一共有n件快递,每个快递都有到的时间和截至日期,取走此快递的时间应该li<=x<=ri,每次最多能拿走k件快递,每天可去快递点多次。求把快递取完所需的最少次数。
思路:
所以维护一个r的升序的优先队列,
遍历右端点r,每次把l小于当前r的快递加入优先队列中。
如果今天拿的是k的整数倍,就正好。
如果不是k的整数倍,就补到k的整数倍,拿快要过期的快递,尽量最优。
代码:
#include
using namespace std;
typedef long long ll;
const int N = 1e6+10;
typedef pair PII;
#define fi first
#define se second
#define pb push_back
int n,k,l,r;
priority_queue,greater > q;//升序队列,默认降序
inline void solve(){
cin>>n>>k;
while(!q.empty()) q.pop();//清空优先队列
vector st;//st储存一个快递到的时间和到期的时间 ,即{l,r}
vector ed;//ed储存过期的时间,即r
for(int i=1;i<=n;i++){
cin>>l>>r;
st.pb({l,r});
ed.pb(r);
}
//先排序
sort(st.begin(),st.end());
sort(ed.begin(),ed.end());
//对ed去重
ed.erase(unique(ed.begin(),ed.end()),ed.end());
int now=0,ans=0;
for (auto it:ed){
while(now>t;
while(t--){
solve();
}
return 0;
}
题意:
给出两个长度为n的排列p,q和一个长度为2n的序列S,R最初为空。
每次可以选择p或q的最左边的数字放在R的右边,问有多少种方法能使R最后为S。
思路及代码:
(1)模拟:
当p和q的后面部分是一模一样时,有两种方法,ans*=2;
#include
using namespace std;
typedef long long ll;
const int N =4e6+10;
const int mod=998244353;
int p[N],q[N],s[N];
inline void solve(){
int n;
cin>>n;
for(int i=0;i>p[i];
for(int i=0;i>q[i];
for(int i=0;i<2*n;i++) cin>>s[i];
int ans=1;
int i=0,j=0,k=0;
while(k<2*n){
if(s[k]!=p[i]&&s[k]!=q[j]){
cout<<0<>t;
while(t--){
solve();
}
return 0;
}
(2)dp
/*
定义dp[2n][2],dp[i][0]表示第i位匹配在p中,dp[i][1]表示第i位匹配在q中。
*/
#include
using namespace std;
typedef long long ll;
const int N =2e6+10;
const int mod=998244353;
int p[N],q[N],s[2*N],dp[2*N][2],n;
inline int dfs(int x,int y,int pos){//pos为0:代表和p匹配,为1:代表和q匹配
if(x>n&&y>n) return 1;
if(dp[x+y-1][pos]!=-1) return dp[x+y-1][pos];
int ans=0;
if(p[x]==s[x+y-1]&&x<=n){
ans=(dfs(x+1,y,0)+ans)%mod;
}
if(q[y]==s[x+y-1]&&y<=n){
ans=(dfs(x,y+1,1)+ans)%mod;
}
return dp[x+y-1][pos]=ans;
}
inline void solve(){
cin>>n;
for(int i=0;i<2*N;i++) {
dp[i][0]=-1;
dp[i][1]=-1;
}
for(int i=1;i<=n;i++) cin>>p[i];
for(int i=1;i<=n;i++) cin>>q[i];
for(int i=1;i<=2*n;i++) cin>>s[i];
int ans=0;
if(p[1]==s[1]) ans=(ans+dfs(2,1,0))%mod;
if(q[1]==s[1]) ans=(ans+dfs(1,2,1))%mod;
cout<>t;
while(t--){
solve();
}
return 0;
}