Week2实验

A-化学

题目大意

甄别烷烃基的类别

解析:

仔细观察图发现,可以记录每个节点的度,根据度分类:

根据度为2/3/4的节点个数分类
鉴于第2类和第3类度都为 1 1 1 2 2 3,再通过找度为3的节点相连的3个节点的度,若为1 1 2,则为第2类,若为 2 2 1,则为第3类

源码:

#include <cstdio>
#include <iostream>
//#include <vector> 
#include <cstring>
#include <string> 
using namespace std;
int a[7];
int b[5];
int G[7][7];
string s[5] = {{"n-hexane"},{"2-methylpentane"},{"3-methylpentane"},{"2,3-dimethylbutane"},{"2,2-dimethylbutane"}};

int dif()
{
	if(b[4] == 1) return 4;
    if(b[3] == 2) return 3;
	if(b[2] == 4) return 0;
	else
	{
		int p;

		for(int i = 1; i <= 6; i++)//p为度是3的点 
		 if(a[i] == 3) p = i;
		int c[4] = {0};
		int n = 1;
		for(int i = 1; i <= 6; i++)
		{
			if(G[i][p] == 1 || G[p][i] == 1)
			{
				c[n++] = i; 
			}
		}
		int o[4] = {0};
		for(int i=0;i<4;i++)
		{
			o[a[c[i]]]++;
		}
	
		if(o[1] == 2) return 1;
		else return 2;
	}

}

int main()
{
	int n;
	scanf("%d",&n);
	for(int i=0;i<n;i++)
	{
		for(int i=0;i<7;i++)/*初始化数组*/
	    {
	    	a[i]=0;
		}
	    
	    for(int i=0;i<5;i++)/*初始化数组*/
	    {
	    	b[i]=0;
		}
	    
	    for(int i=0;i<7;i++)/*初始化数组*/
	    {
	    	for(int j=0;j<7;j++)
	    	   G[i][j]=0;
		}
		int x,y;
		for(int i = 1; i <= 5; i++)
		{
			scanf("%d%d",&x,&y);
			G[x][y] = 1;a[x]++;a[y]++;
		}
		for(int i = 1; i <= 6; i++)
			b[a[i]]++;
		int t = dif();
		cout << s[t] << "\n";
	}
	return 0;
}

B - 爆零(×)大力出奇迹(√)

题目大意

根据给出的榜单,输出一个实时排名。实时排名以AC数为第一关键字(降序),罚时为第二关键字(升序),姓名为第三关键字(升序)。

题解

通过观察数据,发现每一题的得分情况我们可以分开进行读入。
可以采取scanf读入然后处理字符串的方式,也可以利用sscanf(s,"%d(%d)",x,y)来进行。
是一种多条件的排序。其优先级依次为:
(1)做出来的题目 降序
(2)花费时间(含罚时) 升序
(3)名字的字典序 升序
源码

#include <stdio.h>
#include <algorithm>
#include <string.h>
using namespace std;

struct STU
{
    char name[20];
    int ac;
    int cnt;
} s[1000];

int cmp(STU x,STU y)//先按题数排,再按总时间小的在头排序
{
    if(x.cnt!=y.cnt)
        return x.cnt>y.cnt;
    return x.ac<y.ac;
}

int main()
{
    int n,t;
    while(~scanf("%d%d",&n,&t))
    {
        int i,j,k = 0;
        char sc[100];
        while(~scanf("%s",s[k].name))
        {
            s[k].ac = s[k].cnt = 0;
            for(i = 0; i<n; i++)
            {
                scanf("%s",sc);
                if(!strcmp(sc,"0"))//没提交,自然不算
                    continue;
                if(sc[0] == '-')//提交的都是错的,而且没A,也不算
                    continue;
                s[k].cnt++;
                int len = strlen(sc),f = 0,l = 0;
                if(!strstr(sc,"("))//没有括号代表1A,,直接算
                {
                    while(sc[l])
                    {
                        f = f*10+sc[l]-'0';
                        l++;
                    }
                    s[k].ac+=f;
                    continue;
                }
                while(sc[l]!='(')//有括号就要算出提交的时间
                {
                    f = f*10+sc[l]-'0';
                    l++;
                }
                s[k].ac+=f;
                f = 0;
                l++;
                while(sc[l]!=')')//罚时
                {
                    f = f*10+sc[l]-'0';
                    l++;
                }
                f = f*t;
                s[k].ac+=f;
            }
            k++;
        }
        sort(s,s+k,cmp);
        for(i = 0; i<k; i++)
        {
            printf("%-10s%3d%5d\n",s[i].name,s[i].cnt,s[i].ac);
        }
    }

    return 0;
}

C - 瑞神打牌 (不支持C++11,G++和C++编译器都试试提交哈)

给出牌的顺序和起始发牌人。
定义牌的顺序,首先,花色是C<D<S<H。对于牌面的值,我们规定2 < 3 < 4 < 5 < 6 < 7 < 8 < 9 < T < J < Q < K < A。
按照给定的格式从小打到输出每个玩家手中的的牌。

扫描二维码关注公众号,回复: 9604136 查看本文章

解析:
对于顺序拿牌,可以通过%4来实现循环的顺序发牌,在拿牌的时候,定义结构体,其中有两个char的变量,即存放牌的大小和花色,每次读入两个字符,通过两个函数,分别将读进来的字符转换成对应大小的数字。重载<,即先按照花色升序,再按照牌的大小输出。

源码


#include<stdio.h>
#include<algorithm>
#include<vector>
#include<cstring>
using namespace std;
char s[1000];
int start;
struct TT
{
	char x,y;
	TT();
	TT(char x,char y):x(x),y(y){};
};
 
int check(char c)
{   switch (c)
			{
				case 'C':return 0; break;
				case 'D':return 1; break;
				case 'S':return 2; break;
				case 'H':return 3; break;
			}
	
}
 
int get(char c)

{   switch (c)
			{
				case 'T':return 10; break;
				case 'J':return 11; break;
				case 'Q':return 12; break;
				case 'K':return 13; break;
				case 'A':return 14; break;
			}
	
	return c-'0';
}
 
bool cmp(const TT &a,const TT &b)
{
	if (a.x==b.x) return get(a.y)<get(b.y);
	return check(a.x)<check(b.x);
}
 
vector<TT> a[4];
 
int main()
{
	int f=0;
	while (~scanf("%s",s))
	{
		if (s[0]=='#') break;
		if (f) printf("\n"); else f=1;
		if (s[0]=='E') start=0;
		if (s[0]=='S') start=1;
		if (s[0]=='W') start=2;
		if (s[0]=='N') start=3;
		
		for (int i=0;i<4;i++) a[i].clear();
		scanf("%s",s);
		scanf("%s",s+52);
		for (int i=0;i<104;i+=2,start=(start+1)%4)
		a[start].push_back(TT(s[i],s[i+1]));
		for (int i=0;i<4;i++) 
		sort(a[i].begin(),a[i].end(),cmp);
		for (int i=0;i<4;i++)
		{   
			switch (i)
			{
				case 0:printf("South player:\n"); break;
				case 1:printf("West player:\n"); break;
				case 2:printf("North player:\n"); break;
				case 3:printf("East player:\n"); break;
			}
			printf("+---+---+---+---+---+---+---+---+---+---+---+---+---+\n");
			for (int j=0;j<a[i].size();j++)
			{
				printf("|%c %c",a[i][j].y,a[i][j].y);
				if (j==a[i].size()-1) printf("|\n");
			}
			for (int j=0;j<a[i].size();j++)
			{
				printf("| %c ",a[i][j].x);
				if (j==a[i].size()-1) printf("|\n");
			}
			for (int j=0;j<a[i].size();j++)
			{
				printf("|%c %c",a[i][j].y,a[i][j].y);
				if (j==a[i].size()-1) printf("|\n");
			}
			printf("+---+---+---+---+---+---+---+---+---+---+---+---+---+\n");
		}
	}
	return 0;
}

发布了2 篇原创文章 · 获赞 0 · 访问量 14

猜你喜欢

转载自blog.csdn.net/qq_43636442/article/details/104683333
今日推荐