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。
按照给定的格式从小打到输出每个玩家手中的的牌。
解析:
对于顺序拿牌,可以通过%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;
}