• 2022“杭电杯”中国大学生算法设计超级联赛(3)


    1003.Cyber Language

    题意:

    给出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<
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28

    (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;
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30

    1009.Package Delivery

    题意:
    一共有n件快递,每个快递都有到的时间和截至日期,取走此快递的时间应该li<=x<=ri,每次最多能拿走k件快递,每天可去快递点多次。求把快递取完所需的最少次数。

    思路:

    所以维护一个r的升序的优先队列,
    遍历右端点r,每次把l小于当前r的快递加入优先队列中。
    如果今天拿的是k的整数倍,就正好。
    如果不是k的整数倍,就补到k的整数倍,拿快要过期的快递,尽量最优。

    vector去重的方法

    代码:

    
    #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;
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62

    1012.Two Permutations

    题意:
    给出两个长度为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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80

    (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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
  • 相关阅读:
    Vue 表单控制 生命周期
    【leetcode】深搜、暴搜、回溯、剪枝(C++)2
    ESP32网络开发实例-TCP服务器数据传输
    TPO69 01|Why Snakes Have Forked Tongues|阅读真题精读|10:40-11:40+15:30-16:57
    flutter显示这样的错误如何解决
    【Unity基础】3.脚本控制物体运动&天空盒
    【重识云原生】第六章容器6.4.3节——ReplicationController
    基于STM32设计的酒驾报警系统
    WiFi基础学习到实战(一)
    amazon账号注册用什么软件?
  • 原文地址:https://blog.csdn.net/srh20/article/details/126016181