• Codeforces Round #322 (Div. 2)


    水 A - Vasya the Hipster

    /************************************************
    * Author        :Running_Time
    * Created Time  :2015/9/28 星期一 16:58:13
    * File Name     :A.cpp
     ************************************************/
    
    #include <cstdio>
    #include <algorithm>
    #include <iostream>
    #include <sstream>
    #include <cstring>
    #include <cmath>
    #include <string>
    #include <vector>
    #include <queue>
    #include <deque>
    #include <stack>
    #include <list>
    #include <map>
    #include <set>
    #include <bitset>
    #include <cstdlib>
    #include <ctime>
    using namespace std;
    
    #define lson l, mid, rt << 1
    #define rson mid + 1, r, rt << 1 | 1
    typedef long long ll;
    const int N = 1e5 + 10;
    const int INF = 0x3f3f3f3f;
    const int MOD = 1e9 + 7;
    const double EPS = 1e-8;
    
    int main(void)    {
    	int a, b;	scanf ("%d%d", &a, &b);
    	int ans = min (a, b);
    	printf ("%d ", ans);
    	a -= ans, b -= ans;
    	ans = a / 2 + b / 2;
    	printf ("%d
    ", ans);
    
        return 0;
    }
    

    水 B - Luxurious Houses

    从后往前,维护一个后缀最大值

    /************************************************
    * Author        :Running_Time
    * Created Time  :2015/9/28 星期一 16:58:21
    * File Name     :B.cpp
     ************************************************/
    
    #include <cstdio>
    #include <algorithm>
    #include <iostream>
    #include <sstream>
    #include <cstring>
    #include <cmath>
    #include <string>
    #include <vector>
    #include <queue>
    #include <deque>
    #include <stack>
    #include <list>
    #include <map>
    #include <set>
    #include <bitset>
    #include <cstdlib>
    #include <ctime>
    using namespace std;
    
    #define lson l, mid, rt << 1
    #define rson mid + 1, r, rt << 1 | 1
    typedef long long ll;
    const int N = 1e5 + 10;
    const int INF = 0x3f3f3f3f;
    const int MOD = 1e9 + 7;
    const double EPS = 1e-8;
    int a[N], mx[N], ans[N];
    
    int main(void)    {
    	int n;	scanf ("%d", &n);
    	for (int i=1; i<=n; ++i)	{
    		scanf ("%d", &a[i]);
    	}
    	mx[n] = a[n];	ans[n] = 0;
    	for (int i=n-1; i>=1; --i)	{
    		if (a[i] <= mx[i+1])	{
    			ans[i] = mx[i+1] + 1 - a[i];
    		}
    		mx[i] = max (mx[i+1], a[i]);
    	}
    
    	for (int i=1; i<=n; ++i)	{
    		printf ("%d%c", ans[i], i == n ? '
    ' : ' ');
    	}
    
        return 0;
    }
    

      

    贪心 C - Developing Skills

    题意:给n个数,最多可以增加k,每个数上限为100,问max sum (a[i] / 10)

    分析:若k很小时,优先加给需要最小数字能到下一个十整数的,按照这个规则排序。若还有多余则继续,此时每个数字加10,直到100或者k<=0,及时break。

    /************************************************
    * Author        :Running_Time
    * Created Time  :2015/9/28 星期一 16:58:28
    * File Name     :C.cpp
     ************************************************/
    
    #include <cstdio>
    #include <algorithm>
    #include <iostream>
    #include <sstream>
    #include <cstring>
    #include <cmath>
    #include <string>
    #include <vector>
    #include <queue>
    #include <deque>
    #include <stack>
    #include <list>
    #include <map>
    #include <set>
    #include <bitset>
    #include <cstdlib>
    #include <ctime>
    using namespace std;
    
    #define lson l, mid, rt << 1
    #define rson mid + 1, r, rt << 1 | 1
    typedef long long ll;
    const int N = 1e5 + 10;
    const int INF = 0x3f3f3f3f;
    const int MOD = 1e9 + 7;
    const double EPS = 1e-8;
    int a[N];
    
    int cal(int x)	{
    	if (x == 100)	return 0;
        int a = x / 10;
        return (a + 1) * 10 - x;
    }
    
    bool cmp(int x, int y)	{
        return cal (x) < cal (y);
    }
    
    int main(void)    {
    	int n, k;	scanf ("%d%d", &n, &k);
    	for (int i=1; i<=n; ++i)	{
    		scanf ("%d", &a[i]);
    	}
    	sort (a+1, a+1+n, cmp);
    	while (k > 0)	{
    		bool up = false;
    		for (int i=1; i<=n; ++i)	{
    			if (a[i] == 100)	continue;
    			int dt = cal (a[i]);
    			if (dt > k || k <= 0)	break;
    			if (dt <= k)	{
    				k -= dt;	a[i] += dt;
    				up = true;
    			}
    		}
    		if (!up)	break;
    	}
    
    	int ans = 0;
    	for (int i=1; i<=n; ++i)	{
    		ans += a[i] / 10;
    	}
    	printf ("%d
    ", ans);
    
        return 0;
    }
    

      

    模拟 D - Three Logos

    题意:很好理解,就是三个矩形组合成一个正方形

    分析:想到了很简单,无非就是两种情况,比赛时没想那么多,代码很挫,建议看图片就行了。。。

    /************************************************
    * Author        :Running_Time
    * Created Time  :2015/9/28 星期一 17:39:02
    * File Name     :D.cpp
     ************************************************/
    
    #include <cstdio>
    #include <algorithm>
    #include <iostream>
    #include <sstream>
    #include <cstring>
    #include <cmath>
    #include <string>
    #include <vector>
    #include <queue>
    #include <deque>
    #include <stack>
    #include <list>
    #include <map>
    #include <set>
    #include <bitset>
    #include <cstdlib>
    #include <ctime>
    using namespace std;
    
    #define lson l, mid, rt << 1
    #define rson mid + 1, r, rt << 1 | 1
    typedef long long ll;
    const int N = 1e5 + 10;
    const int INF = 0x3f3f3f3f;
    const int MOD = 1e9 + 7;
    const double EPS = 1e-8;
    
    int main(void)    {
    	int x[3], y[3];
    	for (int i=0; i<3; ++i)	{
    		scanf ("%d%d", &x[i], &y[i]);
    		if (x[i] > y[i])	swap (x[i], y[i]);
    	}
    	int sx = x[0] + x[1] + x[2];
    	if (sx == y[0] && sx == y[1] && sx == y[2])	{				//第一种情况
    		printf ("%d
    ", sx);
    		for (int i=0; i<3; ++i)	{
    			for (int j=1; j<=x[i]; ++j)	{
    				for (int k=1; k<=y[i]; ++k)	{
    					printf ("%c", i == 0 ? 'A' : (i == 1) ? 'B' : 'C');
    				}
    				puts ("");
    			}
    		}
    	}
    	else	{													//第二种情况
    		bool flag = false;
    		int n = 0, id = 0;
    		for (int i=0; i<3; ++i)	{
    			if (n < y[i])	{
    				n = y[i];	id = i;
    			}
    		}
            int tx = n - x[id];
            for (int i=0; i<3; ++i)	{
    			for (int j=0; j<3; ++j)	{
    				if (i == id || j == id)	continue;
                    if (x[i] == x[j] && x[i] == tx)	{
    					if (y[i] + y[j] == n)	{
    						flag = true;	break;
    					}
                    }
                    else if (x[i] == y[j] && x[i] == tx)	{
    					if (y[i] + x[j] == n)	{
    						flag = true;	break;
    					}
                    }
                    else if (y[i] == x[j] && y[i] == tx)	{
    					if (x[i] + y[j] == n)	{
    						flag = true;	break;
    					}
                    }
                    else if (y[i] == y[j] && y[i] == tx)	{
    					if (x[i] + x[j] == n)	{
    						flag = true;	break;
    					}
                    }
    			}
            }
    
    		if (flag)	{												//输出答案
    			printf ("%d
    ", n);
    			for (int i=1; i<=x[id]; ++i)	{
    				for (int j=1; j<=y[id]; ++j)	{
    					printf ("%c", id == 0 ? 'A' : (id == 1) ? 'B' : 'C');
    				}
    				puts ("");
    			}
    			char p, q;
    			if (id == 0)	p = 'B', q = 'C';
    			else if (id == 1)	p = 'A', q = 'C';
    			else	p = 'A', q = 'B';
    			for (int i=0; i<3; ++i)	{
    			for (int j=0; j<3; ++j)	{
    				if (i == id || j == id)	continue;
                    if (x[i] == x[j] && x[i] == tx)	{
    					if (y[i] + y[j] == n)	{
    						for (int k=1; k<=tx; ++k)	{
    							for (int l=1; l<=n; ++l)	{
    								printf ("%c", l <= y[i] ? p : q);
    							}
    							puts ("");
    						}
    						return 0;
    					}
                    }
                    else if (x[i] == y[j] && x[i] == tx)	{
    					if (y[i] + x[j] == n)	{
    						for (int k=1; k<=tx; ++k)	{
    							for (int l=1; l<=n; ++l)	{
    								printf ("%c", l <= y[i] ? p : q);
    							}
    							puts ("");
    						}
    						return 0;
    					}
                    }
                    else if (y[i] == x[j] && y[i] == tx)	{
    					if (x[i] + y[j] == n)	{
    						for (int k=1; k<=tx; ++k)	{
    							for (int l=1; l<=n; ++l)	{
    								printf ("%c", l <= x[i] ? p : q);
    							}
    							puts ("");
    						}
    						return 0;
    					}
                    }
                    else if (y[i] == y[j] && y[i] == tx)	{
    					if (x[i] + x[j] == n)	{
    						for (int k=1; k<=tx; ++k)	{
    							for (int l=1; l<=n; ++l)	{
    								printf ("%c", l <= x[i] ? p : q);
    							}
    							puts ("");
    						}
    						return 0;
    					}
                    }
    			}
            }
    		}
    		else	puts ("-1");
    	}
    
        return 0;
    }
    

     

    最后老夫夜观星相,预测此次rating会超1700,为了能够在div2继续虐菜,“故意”hack失败。。

    编译人生,运行世界!
  • 相关阅读:
    日报 18/05/29
    jsvascript === 和==的区别
    分享个数组
    ROC曲线绘制
    DLL中传递STL参数(如Vector或者list等)会遇到的问题[转载]
    利用JAX-WS 开发web服务
    菜鸟的成长之路——在清华特奖经验分享交流会上的演讲
    一段小代码的思考
    关于Vector中的元素中含有指针成员的情况
    关于职业规划——好帖【转载】
  • 原文地址:https://www.cnblogs.com/Running-Time/p/4846245.html
Copyright © 2020-2023  润新知