现在的位置: 首页 > 综合 > 正文

DAY_4

2018年04月28日 ⁄ 综合 ⁄ 共 7127字 ⁄ 字号 评论关闭

莫名其妙被唐老师的带进了这个专题。。。。

A题:

You are building a house. You'd prefer if all the walls have a precise right angle relative to the ground, but you have no device to measure angles. A friend says he has a great idea how you could ensure that all walls are upright: All you need to do is
step away a few feet from the wall, measure how far away you are from the wall, measure the height of the wall, and the distance from the upper edge of the wall to where you stand. You friend tells you to do these measurements for all walls, then he'll tell
you how to proceed. Sadly, just as you are done, a timber falls on your friend, and an ambulance brings him to the hospital. This is too bad, because now you have to figure out what to do with your measurements yourself.

Given the three sides of a triangle, determine if the triangle is a right triangle, i.e. if one of the triangle's angles is 90 degrees.

Input

Input starts with an integer T (≤ 200), denoting the number of test cases.

Each test case consists of three integers 1 ≤ a, b, c ≤ 40000 separated by a space. The three integers are the lengths of the sides of a triangle.

Output

For each case, print the case number and "yes" or "no" depending on whether it's a right angle or not.

Sample Input

2

36 77 85

40 55 69

Sample Output

Case 1: yes

Case 2: no

就是说输入三条边判断一个三角形是不是直角三角形,直接给边排顺序,然后找到勾股关系就行了。

代码:

# include<cstdio>
# include<iostream>
# include<algorithm>
# include<cstring>
# include<string>
# include<cmath>
# include<queue>
# include<stack>
# include<set>
# include<map>

using namespace std;

# define inf 999999999

int main(void)
{
    int t;cin>>t;
    int icase = 1;
    while ( t-- )
    {
        int a,b,c;
        cin>>a>>b>>c;
        int sum = a+b+c;
        int a1 = max(c,max(a,b));
        int c1 = min(c,min(a,b));
        int b1 = sum-a1-c1;
        printf("Case %d: ",icase++);
        if ( a1*a1==c1*c1+b1*b1 )
            cout<<"yes"<<endl;
        else
            cout<<"no"<<endl;
    }


	return 0;
}

B题:

Given two integers, a and b, you should check whether a is divisible by b or not. We know that an integer a is divisible by an integer b if and only if
there exists an integer c such that a = b * c.

Input

Input starts with an integer T (≤ 525), denoting the number of test cases.

Each case starts with a line containing two integers a (-10200 ≤ a ≤ 10200) and b (|b| > 0, b fits into a 32 bit signed integer). Numbers will not contain leading zeroes.

Output

For each case, print the case number first. Then print 'divisible' if a is divisible by b. Otherwise print 'not divisible'.

Sample Input

6

101 101

0 67

-101 101

7678123668327637674887634 101

11010000000000000000 256

-202202202202000202202202 -101

Sample Output

Case 1: divisible

Case 2: divisible

Case 3: divisible

Case 4: not divisible

Case 5: divisible

Case 6: divisible

一个简单的大数除法,只要明确分清楚负数和正数的除法就可以了。

代码:

# include<cstdio>
# include<iostream>
# include<algorithm>
# include<cstring>
# include<string>
# include<cmath>
# include<queue>
# include<stack>
# include<set>
# include<map>

using namespace std;

typedef long long LL;

# define inf 999999999

int main(void)
{
    int t;cin>>t;
    int icase = 1;
    string s;
    getchar();
    while ( t-- )
    {
        LL b;
        LL cur = 0;
        cin>>s>>b;
        if ( s[0]!='-' )
        {
               for ( int i = 0;i < s.size();i++ )
                {
                    cur = cur*10+s[i]-'0';
                    cur = cur%b;
                }
        }
        else
        {
            for ( int i = 1;i < s.size();i++ )
            {
                cur = cur*10+s[i]-'0';
                cur = cur%b;
            }
        }
        printf("Case %d: ",icase++);
        if ( cur==0 )
        {
            printf("divisible\n");
        }
        else
        {
            printf("not divisible\n");
        }
        s.clear();

    }


 return 0;

}

C题:

Description

One measure of ``unsortedness'' in a sequence is the number of pairs of entries that are out of order with respect to each other. For instance, in the letter sequence ``DAABEC'', this measure is 5, since D is greater than four letters to its right and E is
greater than one letter to its right. This measure is called the number of inversions in the sequence. The sequence ``AACEDGG'' has only one inversion (E and D)---it is nearly sorted---while the sequence ``ZWQM'' has 6 inversions (it is as unsorted as can
be---exactly the reverse of sorted). 

You are responsible for cataloguing a sequence of DNA strings (sequences containing only the four letters A, C, G, and T). However, you want to catalog them, not in alphabetical order, but rather in order of ``sortedness'', from ``most sorted'' to ``least sorted''.
All the strings are of the same length. 

Input

The first line contains two integers: a positive integer n (0 < n <= 50) giving the length of the strings; and a positive integer m (0 < m <= 100) giving the number of strings. These are followed by m lines, each containing a string of length n.

Output

Output the list of input strings, arranged from ``most sorted'' to ``least sorted''. Since two strings can be equally sorted, then output them according to the orginal order.

Sample Input

10 6
AACATGAAGG
TTTTGGCCAA
TTTGGCCAAA
GATCAGATTT
CCCGGGGGGA
ATCGATGCAT

Sample Output

CCCGGGGGGA
AACATGAAGG
GATCAGATTT
ATCGATGCAT
TTTTGGCCAA
TTTGGCCAAA

解题思路:

其实就是求每个串的逆序数,然后按照从小到大进行排序就OK了。注意在struct中使用string的妙处。。

代码:

# include<cstdio>
# include<iostream>
# include<algorithm>
# include<cstring>
# include<string>
# include<cmath>
# include<queue>
# include<stack>
# include<set>
# include<map>

using namespace std;

typedef long long LL;

# define inf 999999999
# define MAX 100+4

struct node
{
    string dna;
    int cnt;
}a[MAX];

int cmp ( const struct node & x,const struct node & y )
{
    return x.cnt < y.cnt;
}


int main(void)
{
    int n,m;
    while ( cin>>n>>m )
    {
        for ( int i = 0;i < m;i++ )
        {
            cin>>a[i].dna;
            a[i].cnt = 0;
            for ( int j = 0;j < n-1;j++ )
            {
                for ( int k = j+1;k < n;k++ )
                {
                    if ( a[i].dna[j] > a[i].dna[k] )
                    {
                        a[i].cnt++;
                    }
                }
            }
        }
        stable_sort(a,a+m,cmp);
        for ( int i = 0;i < m;i++ )
        {
            cout<<a[i].dna<<endl;
        }


    }

    return 0;
}

D题:

Description

Sometimes I feel angry to arrange contests, because I am too lazy. Today I am arranging a contest for AIUB students. So, I made a plan. While they will be busy with the contest, as a punishment I will cover their rooms with dusts. So, when they will be back,
they will surely get angry, and it will cause them some pain.

So, at first, I will make up my mind, that means I will fix the amount of dusts for each student. This amount may not be same for all. Now you are given the amount of dust unit for each student. You have to help me finding the total dust unit I have to collect
to cause them pain.

But there is a problem, my random function which generates dust units for students has a bug, it sometimes returns negative numbers. If a student gets negative number, I think he is lucky, so I will not cause him any pain with dusts.

Input

Input starts with an integer T (≤ 100), denoting the number of test cases.

Each case starts with a blank line. The next line contains an integer N (1 ≤ N ≤ 1000), means that there are N students. The next line will contain Nintegers separated by spaces which denote the dust unit
for all students. The dust unit for any student will not contain more than two digits.

Output

For each case print the case number and the total required dust units.

Sample Input

2

 

3

1 5 10

 

2

1 99

Sample Output

Case 1: 16

Case 2: 100

解题思路:求n个数字的和,如果a[i]<0,那么a[i]==0..

代码:

# include<cstdio>
# include<iostream>
# include<algorithm>
# include<cstring>
# include<string>
# include<cmath>
# include<queue>
# include<stack>
# include<set>
# include<map>

using namespace std;

typedef long long LL;

# define inf 999999999
# define MAX 1000+4

int a[MAX];


int main(void)
{
   int t;cin>>t;
   int icase = 1;
   while ( t-- )
   {
       int n;cin>>n;
       int sum = 0;
       for ( int i = 0;i < n;i++ )
       {
           cin>>a[i];
           if ( a[i] < 0 )
                a[i]=0;
           sum+=a[i];
       }
       printf("Case %d: ",icase++);
       cout<<sum<<endl;
   }


    return 0;
}

E题:

解题思路:大数加法,用数组给写挂了,等我学了JAVA的大数在更新~

代码:

F题:

解题思路:一个简单的DFS,只要搜索出来@开始的'.'的个数就可以了。

代码:

# include<cstdio>
# include<iostream>
# include<algorithm>
# include<cstring>
# include<string>
# include<cmath>
# include<queue>
# include<stack>
# include<set>
# include<map>

using namespace std;

# define inf 999999999
# define MAX 23

int ans;
int w,h;
char grid[MAX][MAX];
int book[MAX][MAX];
int next[4][2]={ {1,0},{0,-1},{-1,0},{0,1} };

void dfs( int x,int y )
{
    grid[x][y] = '#';
    for ( int i = 0;i < 4;i++ )
    {
        int now_x = x+next[i][0];
        int now_y = y+next[i][1];

        if ( now_x >=1&&now_x <= h&&now_y >= 1&&now_y <= w )
       {
           if ( grid[now_x][now_y]=='.' )
            {
                ans++;
                dfs(now_x,now_y);
            }
       }

    }
    return;

}


int main(void)
{
    int t;cin>>t;
    int icase = 1;
    while ( t-- )
    {
        cin>>w>>h;
        for ( int i = 1;i <= h;i++ )
        {
            for ( int j = 1;j <= w;j++ )
            {
                cin>>grid[i][j];
            }
        }
        int st_x;
        int st_y;
        for ( int i = 1;i <= h;i++ )
        {
            for ( int j = 1;j <= w;j++ )
            {
                if ( grid[i][j] == '@' )
                {
                    st_x = i;
                    st_y = j;
                }
            }
        }

        ans = 1;
        dfs( st_x,st_y );
        printf("Case %d: %d\n",icase++,ans);
    }

	return 0;
}

G

H

I

J

K

L

M

N

O

P

Q

R

S

T

U

V

W

X

Y

Z

抱歉!评论已关闭.