Educational Codeforces Round 89 (Rated for Div. 2)题解 A B C

前天网络贼卡 开始十分钟才进去,然后A题过了,B题等了半天也打不开,就去睡觉了,昨天补题。

之前还没怎么打过教育场,因为自己比较菜,所以就补三道吧…

A. Shovels and Swords

time limit per test1 second
memory limit per test256 megabytes
inputstandard input
outputstandard output
Polycarp plays a well-known computer game (we won’t mention its name). In this game, he can craft tools of two types — shovels and swords. To craft a shovel, Polycarp spends two sticks and one diamond; to craft a sword, Polycarp spends two diamonds and one stick.

Each tool can be sold for exactly one emerald. How many emeralds can Polycarp earn, if he has a sticks and b diamonds?

Input
The first line contains one integer t (1≤t≤1000) — the number of test cases.

The only line of each test case contains two integers a and b (0≤a,b≤109) — the number of sticks and the number of diamonds, respectively.

Output
For each test case print one integer — the maximum number of emeralds Polycarp can earn.

Example
inputCopy
4
4 4
1000000000 0
7 15
8 7
outputCopy
2
0
7
5
Note
In the first test case Polycarp can earn two emeralds as follows: craft one sword and one shovel.

In the second test case Polycarp does not have any diamonds, so he cannot craft anything.

思路:A题感觉是到数学题吧,就是如果两个数大的比小的大两倍,就直接输出小的数,如果不是的话,就先制作到相等,再平均制作…具体看代码。

#include
using namespace std;
int main()
{
    int n;
    cin>>n;
    while(n--)
    {
        long long n,x,m;
        cin>>n>>x>>m;
        long long s[n+1];
        while(m--)
        {
           int a,b;
           cin>>a>>b;
           if(x>=a && x<=b)
           {
               s[a]++;
               s[b]++;
           }
           else{

           }
        }
        cout<<x<<endl;
    }
}

B. Shuffle

time limit per test1 second
memory limit per test256 megabytes
inputstandard input
outputstandard output
You are given an array consisting of n integers a1, a2, …, an. Initially ax=1, all other elements are equal to 0.

You have to perform m operations. During the i-th operation, you choose two indices c and d such that li≤c,d≤ri, and swap ac and ad.

Calculate the number of indices k such that it is possible to choose the operations so that ak=1 in the end.

Input
The first line contains a single integer t (1≤t≤100) — the number of test cases. Then the description of t testcases follow.

The first line of each test case contains three integers n, x and m (1≤n≤109; 1≤m≤100; 1≤x≤n).

Each of next m lines contains the descriptions of the operations; the i-th line contains two integers li and ri (1≤li≤ri≤n).

Output
For each test case print one integer — the number of indices k such that it is possible to choose the operations so that ak=1 in the end.

Example
inputCopy
3
6 4 3
1 6
2 3
5 5
4 1 2
2 4
1 2
3 3 2
2 3
1 2
outputCopy
6
2
3
Note
In the first test case, it is possible to achieve ak=1 for every k. To do so, you may use the following operations:

swap ak and a4;
swap a2 and a2;
swap a5 and a5.
In the second test case, only k=1 and k=2 are possible answers. To achieve a1=1, you have to swap a1 and a1 during the second operation. To achieve a2=1, you have to swap a1 and a2 during the second operation.

题解

这道题我的感觉就是找最大区间,就是不断地维护区间,开始是x,x;然后根据输入不断维护,最后输出区间长度

#include
using namespace std;
int main()
{
	int t;
	cin>>t;
	while(t--)
	{
		long long n,x,m;
		cin>>n>>x>>m;
		long long l,k;
		l=k=x;
		long long a,b;
		while(m--)
		{
			cin>>a>>b;
			if(b<l || a>k)
			continue;
			else 
			{
				l=min(a,l);
				k=max(b,k);
			}
			
		}
		cout<<k-l+1<<endl;
	}
 } 

C. Palindromic Paths
time limit per test1.5 seconds
memory limit per test256 megabytes
inputstandard input
outputstandard output
You are given a matrix with n rows (numbered from 1 to n) and m columns (numbered from 1 to m). A number ai,j is written in the cell belonging to the i-th row and the j-th column, each number is either 0 or 1.

A chip is initially in the cell (1,1), and it will be moved to the cell (n,m). During each move, it either moves to the next cell in the current row, or in the current column (if the current cell is (x,y), then after the move it can be either (x+1,y) or (x,y+1)). The chip cannot leave the matrix.

Consider each path of the chip from (1,1) to (n,m). A path is called palindromic if the number in the first cell is equal to the number in the last cell, the number in the second cell is equal to the number in the second-to-last cell, and so on.

Your goal is to change the values in the minimum number of cells so that every path is palindromic.

Input
The first line contains one integer t (1≤t≤200) — the number of test cases.

The first line of each test case contains two integers n and m (2≤n,m≤30) — the dimensions of the matrix.

Then n lines follow, the i-th line contains m integers ai,1, ai,2, …, ai,m (0≤ai,j≤1).

Output
For each test case, print one integer — the minimum number of cells you have to change so that every path in the matrix is palindromic.

Example
inputCopy
4
2 2
1 1
0 1
2 3
1 1 0
1 0 0
3 7
1 0 1 1 1 1 1
0 0 0 0 0 0 0
1 1 1 1 1 0 1
3 5
1 0 1 0 0
1 1 1 1 0
0 0 1 0 0
outputCopy
0
3
4
4
Note
The resulting matrices in the first three test cases:

(1011)
(000000)
⎛⎝⎜101011111101111110101⎞⎠⎟

题解

看了别人的题解,这道题贪心最简单,就是记录好每一步0和1的数量,然后每一次都累加前后走最少的改动次数。

#include
int vis[70][2];
int a[40][40];
using namespace std;
int main()
{
	int t;
	cin>>t;
	while(t--)
	{
		int n,m;
		cin>>n>>m;
		memset(vis,0,sizeof(vis));
		for(int i=1;i<=n;i++)
		{
			for(int j=1;j<=m;j++)
			{
				cin>>a[i][j];
				int he=i+j-2;
				int s=a[i][j];
				vis[he][s]++;
			}
		}
		int fan=n+m-2;
		int ans=0;
		for(int i=0,j=fan;j>i;j--,i++)
		{
			ans+=min(vis[i][0]+vis[j][0],vis[i][1]+vis[j][1]);
		}
		cout<<ans<<endl;
	}
}

你可能感兴趣的:(codeforces)