zoukankan      html  css  js  c++  java
  • Daliy Algorithm (线性dp,思维,贪心)-- day 71

    Nothing to fear


    种一棵树最好的时间是十年前,其次是现在!

    那些你早出晚归付出的刻苦努力,你不想训练,当你觉的太累了但还是要咬牙坚持的时候,那就是在追逐梦想,不要在意终点有什么,要享受路途的过程,或许你不能成就梦想,但一定会有更伟大的事情随之而来。 mamba out~

    2020.5.3


    人一我十, 人十我百,追逐青春的梦想,怀着自信的心,永不言弃!

    Road To Zero

    #include <iostream>
    #include <cstdio>
    #include <algorithm>
    #include <cstdlib>
    #include <cstring>
    #include <vector>
    #include <cassert>
    #include <string>
    #include <cmath>
    #define SIS std::ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
    #define lowbit(x) (x & -x)
    using namespace std;
    typedef long long ll;
    const int MAX = 0x7ffffff;
    int t;
    
    void slove()
    {
    	ll x , y , a , b;
    	cin >> x >> y >> a >> b;
    	if(x == 0 && y == 0)
    	{
    		cout << 0 << endl;
    		return ;
    	}else
    	{
    		if(x < y)swap(x , y);
    		// 首先保证 X >= y
    		if(2*a <= b)
    		{
    			cout << (x + y) * a << endl;
    		}else cout << y*b + (x - y) * a << endl;
    		return;
    	}
    }
    int main()
    {
    	SIS;
    	cin >> t;
    	while(t--)
    	{
    		slove();
    	}
    }
    

    train

    一个还不错得思维题目,将问题分为两种极端边界情况。
    从这两种情况乱各种直接筛选出来最优解。

    #include <iostream>
    #include <cstdio>
    #include <algorithm>
    #include <cstdlib>
    #include <cstring>
    #include <vector>
    #include <cassert>
    #include <string>
    #include <cmath>
    #include <map>
    #define SIS std::ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
    #define lowbit(x) (x & -x)
    using namespace std;
    typedef long long ll;
    const int MAX = 0x7ffffff;
    int t;
    map<int,int> m;
    void slove()
    {
    	int n;
    	cin >> n;
    	vector<int> a(n + 1);
    	int x = 0;
    	int diff = 0,cnt = 0; 
    	for (int i = 1; i <= n; ++i)
    	{
    		cin >> x;
    		if(a[x] == 0)diff++;
    		a[x]++;cnt = max(cnt , a[x]);
    	}
    	int ans = max(min(diff - 1,cnt),min(diff,cnt - 1));
    	cout << ans << endl;
    	return ;
    }
    int main()
    {
    	SIS;
    	cin >> t;
    	while(t--)
    	{
    		slove();
    	}
    }
    

    杨老师得照相排列

    多维度线性dp经典好题 值得做N遍

    #include <iostream>
    #include <cstdio>
    #include <cstdlib>
    #include <algorithm>
    #include <cmath>
    #include <cstring> 
    using namespace std;
    const int N = 31;
    typedef long long ll;
    ll f[N][N][N][N][N];
    
    int main()
    {
    	int n;
    	while(cin >> n , n)
    	{
    		memset(f , 0 , sizeof f);
    		int s[5] = {0};
    		// 输入每一排得人数
    		for(int i = 0;i < n; i++)cin >> s[i];
    		f[0][0][0][0][0] = 1;
    		for(int a = 0;a <= s[0] ;a ++)
    			for(int b = 0;b <= min(a , s[1]); b ++)
    				for(int c = 0;c <= min(b , s[2]); c++)
    					for(int d = 0;d <= min(c ,s[3]); d++)
    						for(int e = 0;e <= min(d , s[4]); e++)
    						{
    							ll &x = f[a][b][c][d][e];
    							if(a && a - 1 >= b)x += f[a-1][b][c][d][e];
    							if(b && b - 1 >= c)x += f[a][b-1][c][d][e];
    							if(c && c - 1 >= d)x += f[a][b][c-1][d][e];
    							if(d && d - 1 >= e)x += f[a][b][c][d-1][e];
    							if(e) x += f[a][b][c][d][e-1];
    						}
    	    cout << f[s[0]][s[1]][s[2]][s[3]][s[4]] << endl;
    	}
    	return 0;
    }
    

    onstanze's machine

    就简单dp, 用来入门蛮不错的一道题

    #include <iostream>
    #include <cstdio>
    #include <algorithm>
    #include <cstdlib>
    #include <cstring>
    #include <vector>
    #include <cassert>
    #include <string>
    #include <cmath>
    #define SIS std::ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
    #define lowbit(x) (x & -x)
    using namespace std;
    typedef long long ll;
    const int MAX = 0x7ffffff;
    const int mod = 1e9 + 7;
    int t;
    void slove(string s)
    {
    	//首先检查存不存在 m 或者 w
    	int n = s.size(); 
    	for(int i = 0;i < n ;i ++)
    	{
    		if(s[i] == 'w' || s[i] == 'm')
    		{
    			cout << 0 << endl;
    			return;
    		}
    	}
    	vector<int> f(n + 1);
    	f[0] = 1,f[1] = 1;
    	for(int i = 2; i <= n;i ++)
    	{
    		f[i] = f[i-1];
    		if(s[i-1] == s[i-2] && (s[i-1] == 'u' || s[i-1] == 'n'))
    		{
    			f[i] = (f[i] + f[i-2]) % mod;
    		}
    	}
    	cout << f[n] << endl;
    }
    int main()
    {
    	SIS;
    	string s;
    	while(cin >> s)
    	{
    		slove(s);
    	}
    }
    
  • 相关阅读:
    Linux线程(一)
    模板(一)
    C++基础(八)
    C++基础(七)
    C++基础(六)
    C++基础(五)
    2.C#基础(二)
    1.C#基础(一)
    2.给出距离1900年1月1日的天数,求日期
    网络协议破解 SMTP
  • 原文地址:https://www.cnblogs.com/wlw-x/p/12824789.html
Copyright © 2011-2022 走看看