zoukankan      html  css  js  c++  java
  • Atcoder Regular-074 Writeup

    C - Chocolate Bar

    题面

    There is a bar of chocolate with a height of H blocks and a width of W blocks. Snuke is dividing this bar into exactly three pieces. He can only cut the bar along borders of blocks, and the shape of each piece must be a rectangle.

    Snuke is trying to divide the bar as evenly as possible. More specifically, he is trying to minimize Smax - Smin, where Smax is the area (the number of blocks contained) of the largest piece, and Smin is the area of the smallest piece. Find the minimum possible value of Smax−Smin.

    题意

    给你一个矩形,切两刀,问怎么切面积极差最小

    直接暴力枚举一下,然后旋转一下。

    代码

    #include<bits/stdc++.h>
    using namespace std;
    
    using ll=long long;
    ll h,w;
    ll ans; 
    ll ans1;
    ll ans2;
    ll ans3;
    ll big;
    ll small;
    
    int main()
    {
        ios::sync_with_stdio(false);
    
    	cin>>h>>w;
    	
    //	if (h%3==0 || w%3==0) return 0*puts("0");
    	
    	ans=h*w;
    	for (ll i=1;i<w;i++)
    	{
    		big=small=ans1=i*h;
    		ans2=h/2*(w-i);
    		ans3=(h+1)/2*(w-i);
    		
    		big=max(big,ans2);
    		big=max(big,ans3);
    		small=min(small,ans2);
    		small=min(small,ans3);
    		
    		ans=min(ans,big-small);
    	}
    	for (ll i=1;i<w;i++)
    	{
    		big=small=ans1=i*h;
    		ans2=(w-i)/2*h;
    		ans3=(w-i+1)/2*h;
    		
    		big=max(big,ans2);
    		big=max(big,ans3);
    		small=min(small,ans2);
    		small=min(small,ans3);
    		
    		ans=min(ans,big-small);
    	}
    		
    	swap(h,w);
    	for (ll i=1;i<w;i++)
    	{
    		big=small=ans1=i*h;
    		ans2=h/2*(w-i);
    		ans3=(h+1)/2*(w-i);
    		
    		big=max(big,ans2);
    		big=max(big,ans3);
    		small=min(small,ans2);
    		small=min(small,ans3);
    		
    		ans=min(ans,big-small);
    	}
    	for (ll i=1;i<w;i++)
    	{
    		big=small=ans1=i*h;
    		ans2=(w-i)/2*h;
    		ans3=(w-i+1)/2*h;
    		
    		big=max(big,ans2);
    		big=max(big,ans3);
    		small=min(small,ans2);
    		small=min(small,ans3);
    		
    		ans=min(ans,big-small);
    	}
    		
    	cout<<ans;
    }
    

    D - 3N Numbers

    题面

    Let N be a positive integer.

    There is a numerical sequence of length 3N, a=(a1,a2,…,a3N). Snuke is constructing a new sequence of length 2N, a', by removing exactly N elements from a without changing the order of the remaining elements. Here, the score of a' is defined as follows: (the sum of the elements in the first half of a')−(the sum of the elements in the second half of a').

    Find the maximum possible score of a'.

    题意

    给你长度为3N的序列 求一长度为2N的子序列 使得前面n个减后面n个最大

    代码

    #include<bits/stdc++.h>
    using namespace std;
    
    using ll = long long ;
    int n;
    ll a[300010]; 
    ll f[300010];
    ll ans;
    ll ret;
    priority_queue<ll> q;
    
    int main()
    {
        ios::sync_with_stdio(false);
    
    	cin>>n;
    	for (int i=1;i<=3*n;i++) cin>>a[i];
    	
    	for (int i=1;i<=n;i++) 
    	{
    		q.push(-a[i]);
    		ans+=a[i];
    		f[i]=ans;
    	}
    	for (int i=n+1;i<=2*n;i++) 
    	{
    		if (a[i]>-q.top()) 
    		{
    			ans+=a[i]+q.top();
    			q.pop();
    			q.push(-a[i]);
    		}
    		f[i]=ans;
    	}
    	
    	
    	while (!q.empty()) q.pop();
    	ans=0;
    	for (int i=3*n;i>2*n;i--) 
    	{
    		q.push(a[i]);
    		ans+=a[i];
    	}
    	ret=f[2*n]-ans;
    	for (int i=2*n;i>n;i--) 
    	{
    		if (a[i]<q.top()) 
    		{
    			ans-=q.top();
    			ans+=a[i];
    			q.pop();
    			q.push(a[i]);
    		}
    		ret=max(ret,f[i-1]-ans);
    	}
    	cout<<ret;
    }
    

    E - RGB Sequence

    题面

    There are N squares arranged in a row. The squares are numbered 1, 2, …, N, from left to right.

    Snuke is painting each square in red, green or blue. According to his aesthetic sense, the following M conditions must all be satisfied. The i-th condition is:

    • There are exactly xi different colors among squares li, li+1, …, ri.

    In how many ways can the squares be painted to satisfy all the conditions? Find the count modulo 109+7.

    题意

    给出m条约束条件。问一个只有RGB的序列的方案有多少种

    令dp[r][g][b]

    • r为red最后出现的位置
    • g为green最后出现的位置
    • b为blue最后出现的位置

    dp[r][g][b]转移到max{r,g,b}+1的位置,枚举放rgb,然后判断是否可行。

    代码

    #include <bits/stdc++.h>
    using namespace std;
    
    using ll = long long;
    ll n;
    ll m;
    ll dp[305][305][305];
    const ll MOD = 1e9+7;
    
    vector<pair<int, int>> v[305];
    
    bool check(int r, int g, int b) 
    {
    	int k = max({r, b, g});
    	for(auto pp: v[k]) 
    	{
        	int ct = 0;
        	int l = pp.first;
        	if (r >= l) ct++;
        	if (g >= l) ct++;
        	if (b >= l) ct++;
        
        	if (ct != pp.second) return false;
    	}
    	return true;
    }
     
    int main() 
    {
    	ios::sync_with_stdio(false);
    	cin.tie(0); 
    
    	cin>>n>>m;
    	for (int i=0;i<m;++i)
    	{
    		int l,r,x;
    		cin>>l>>r>>x;
    		v[r].push_back({l,x});
    	}  
    	dp[0][0][0]=1;
    	ll ret=0;
    	for (int r=0;r<=n;++r)
    	{
    		for (int g=0;g<=n;++g)
    		{
    			for (int b=0;b<=n;++b)
    			{
    				ll c=dp[r][g][b];
    				if (!c) continue;
    				
    				if (!check(r,g,b))
    				{
    					dp[r][g][b]=0;
    					continue;
    				}
    				
    				int k=max({r,g,b}) + 1;
    				if (k-1 == n)
    				{
    					ret+=dp[r][g][b];
    					ret%=MOD;
    				}
    				dp[k][g][b]+=dp[r][g][b] % MOD;
    				dp[r][k][b]+=dp[r][g][b] % MOD;
    				dp[r][g][k]+=dp[r][g][b] % MOD;
    				
    			}
    		}
    	}
    	cout<<ret;
     
    }
    

    F - Lotus Leaves

    题面

    There is a pond with a rectangular shape. The pond is divided into a grid with H rows and W columns of squares. We will denote the square at the i-th row from the top and j-th column from the left by (i, j).

    Some of the squares in the pond contains a lotus leaf floating on the water. On one of those leaves, S, there is a frog trying to get to another leaf T. The state of square (i, j) is given to you by a character aij, as follows:

    • . : A square without a leaf.
    • o : A square with a leaf floating on the water.
    • S : A square with the leaf S.
    • T : A square with the leaf T.

    The frog will repeatedly perform the following action to get to the leaf T: "jump to a leaf that is in the same row or the same column as the leaf where the frog is currently located."

    Snuke is trying to remove some of the leaves, other than S and T, so that the frog cannot get to the leaf T. Determine whether this objective is achievable. If it is achievable, find the minimum necessary number of leaves to remove.

    题意

    看不懂

    代码

    //null
    

    比赛总结

    反应好迟钝啊,B做出来已经快结束了,好在还是做出来了

    有种做div1的错觉,哈哈哈哈(逃

    比赛链接

    http://arc074.contest.atcoder.jp/

  • 相关阅读:
    SQL 2008 死锁进程查看。
    [读书]35前要掌握的66种基本能力第10、11节
    [读书]35前要掌握的66种基本能力第13、14节
    [读书]35前要掌握的66种基本能力第8节
    [读书]35前要掌握的66种基本能力第15、16、17、18节
    近日小节
    [读书]35前要掌握的66种基本能力第26、27、28、29节
    C# aspx 数据绑定集中(待修改)
    [读书]35前要掌握的66种基本能力第6节
    [读书]35前要掌握的66种基本能力第9节
  • 原文地址:https://www.cnblogs.com/EDGsheryl/p/6883762.html
Copyright © 2011-2022 走看看