A-化学
题目:
原子无序!!!
Input&&Output:
Example:
#input:
2
1 2
2 3
3 4
4 5
5 6
1 4
2 3
3 4
4 5
5 6
#output:
n-hexane
3-methylpentane
题解:
每个化学物实际上是一个无向图,因此从图的基本概念来区分不同的化学物如点的度,边。
本题根据观察可以看出根据特殊的度以及与他们相连的点的度就可以区分出这五种不同的化合物。
"n-hexane":最大度仅仅为2;
"2-methylpentane" 最大度为3且有一个 并且与此点相连的三个点的度分别为 1 1 2;
"3-methylpentane" 最大度为3且有一个 并且与此点相连的三个点的度分别为 2 2 1;
"2,3-dimethylbutane" 最大度为3且有两个;
"2,2-dimethylbutane" 最大度为4;
根据特征只需读入是统计各个点的度数、最大度数及出现次数,以及点点之间是否相连就可做出判断。
C++代码:
#include<iostream>
using namespace std;
int mark[6][6];
int a,b,n;
int m[6];//ÿ��ԭ�ӵļ�
void init(){
for(int i = 0;i<6;i++){
m[i] = 0;
for(int j = 0;j<6;j++)
mark[i][j] = 0;
}
}
string out[] = {"n-hexane","2-methylpentane","3-methylpentane","2,3-dimethylbutane","2,2-dimethylbutane"};
int judge(){
int mark2[] = {0,0,0,0,0};
for(int i = 0;i<6;i++){
mark2[m[i]]++;
}
if(mark2[4] == 1)
return 4;
if(mark2[3] == 2)
return 3;
if(mark2[2] == 4)
return 0;
for(int i = 0;i<6;i++){
if(m[i] == 3){
int num = 0;
for(int j = 0;j<6;j++){
if(mark[i][j] == 1){
if(m[j] == 2) num++;
}
if(mark[j][i] == 1){
if(m[j] == 2) num++;
}
}
if(num == 2) return 2;
else return 1;
}
}
}
int main(){
init();
scanf("%d",&n);
for(int t = 0;t<n;t++){
for(int i = 0;i<5;i++){
scanf("%d%d",&a,&b);
mark[a-1][b-1] = 1;
m[a-1]++;
m[b-1]++;
}
cout<<out[judge()]<<endl;
init();
}
return 0;
}
B - 爆零(×)大力出奇迹(√)
题目:
Input&&Output:
Example:
#input:
8 20
GuGuDong 96 -3 40(3) 0 0 1 -8 0
hrz 107 67 -3 0 0 82 0 0
TT 120(3) 30 10(1) -3 0 47 21(2) -2
OMRailgun 0 -99 -8 0 -666 -10086 0 -9999996
yjq -2 37(2) 13 -1 0 113(2) 79(1) -1
Zjm 0 0 57(5) 0 0 99(3) -7 0
#output:
TT 5 348
yjq 4 342
GuGuDong 3 197
hrz 3 256
Zjm 2 316
OMRailgun 0 0
题解:
分析:
1.本题我们需要统计每位学生的答题情况包括罚时、ac数、姓名,因此我们想到利用结构体
2.本题涉及到排序因此我们需要重写结构体的小于号
3.多位学生此处我选择了vector进行存储,并且利用插入排序的方式在加入每个学生时就进行排序
4.如何统计:
观察可知我们可以将分数分为四类: 正数 负数 0 正数(正数);
前三类我们利用cin直接读取整数就可以分析得出,如何区分第四类此处我在每次读入整数后读入一个字符若为' ( '那么需要再读取一次将罚时次数读出,接着再读一次字符将' )'读出
C++代码:
#include<iostream>
#include<vector>
#include<iomanip>
#include<string>
using namespace std;
struct student{
string name;
int num;
int time;
bool operator<(student &x){
if(num!=x.num) return num<x.num;
if(time!=x.time) return time>x.time;
return name>x.name;
}
};
vector<student> v(0);
int n,m;//n题数 m罚时
int Time = 0,num = 0;
int current;
int main(){
scanf("%d%d",&n,&m);
string name;
while(cin>>name){
for(int i = 0;i<n;i++){
cin>>current;
if(current>0){
num++;
Time+=current;
}
char c;
c = getchar();
if(c == '('){
cin>>current;
Time+=current*m;
getchar();
}
}
int p = v.size();
student st = {name,num,Time};
for(int k = 0;k<v.size();k++)
if(!(st<v[k])){
p = k;
break;
}
v.emplace(v.begin()+p,st);
Time = 0;num = 0;
}
for(int i = 0;i<v.size();i++){
cout<<setw(10)<<left<<v[i].name<<" ";
printf("%2d %4d\n",v[i].num,v[i].time);
}
return 0;
}
C - 瑞神打牌
题目:
Input&&Output:
Example:
#input:
N
CTCAH8CJD4C6D9SQC7S5HAD2HJH9CKD3H6D6D7H3HQH4C5DKHKS9
SJDTS3S7S4C4CQHTSAH2D8DJSTSKS2H5D5DQDAH7C9S8C8S6C2C3
#
#output:
South player:
+---+---+---+---+---+---+---+---+---+---+---+---+---+
|6 6|A A|6 6|J J|5 5|6 6|7 7|9 9|4 4|5 5|7 7|9 9|T T|
| C | C | D | D | S | S | S | S | H | H | H | H | H |
|6 6|A A|6 6|J J|5 5|6 6|7 7|9 9|4 4|5 5|7 7|9 9|T T|
+---+---+---+---+---+---+---+---+---+---+---+---+---+
West player:
+---+---+---+---+---+---+---+---+---+---+---+---+---+
|2 2|5 5|9 9|K K|5 5|7 7|9 9|4 4|T T|J J|A A|8 8|A A|
| C | C | C | C | D | D | D | S | S | S | S | H | H |
|2 2|5 5|9 9|K K|5 5|7 7|9 9|4 4|T T|J J|A A|8 8|A A|
+---+---+---+---+---+---+---+---+---+---+---+---+---+
North player:
+---+---+---+---+---+---+---+---+---+---+---+---+---+
|3 3|4 4|J J|2 2|3 3|T T|Q Q|K K|8 8|Q Q|K K|2 2|3 3|
| C | C | C | D | D | D | D | D | S | S | S | H | H |
|3 3|4 4|J J|2 2|3 3|T T|Q Q|K K|8 8|Q Q|K K|2 2|3 3|
+---+---+---+---+---+---+---+---+---+---+---+---+---+
East player:
+---+---+---+---+---+---+---+---+---+---+---+---+---+
|7 7|8 8|T T|Q Q|4 4|8 8|A A|2 2|3 3|6 6|J J|Q Q|K K|
| C | C | C | C | D | D | D | S | S | H | H | H | H |
|7 7|8 8|T T|Q Q|4 4|8 8|A A|2 2|3 3|6 6|J J|Q Q|K K|
+---+---+---+---+---+---+---+---+---+---+---+---+---+
题解:
分析:
1.本题涉及到花色以及数因此我们进行结构体的构造,并采用字符读取的方式
2.本题实际上涉及到了字符的排序,因此我想到了利用map进行映射达到大小的排序
3.由于涉及到多个人的多张牌因此我们想到利用vector或者多维数组进行记录,此处选用数组,最后需要按一定顺序输出因此我们将四个维度分别存储输出顺序对应人的牌
4.涉及到排序结构体需要重载 ' < ',此处利用sort方法进行最后的排序(algorithm库)
3.由题意我们需要先读取一个字符(人的标号),以此判断应该先存到哪一个人的位置,然后每次读取一轮牌,直到读完。
5.注意最后的换行 以及人与人之间的换行
C++代码:
#include<iostream>
#include<map>
#include<algorithm>
using namespace std;
map<char,int> Col;
map<char,int> num;
map<char,int> p;
map<int,string> out;
char b;
struct Card{
char c;
char n;
};
bool cmp(Card x1,Card x){
if(x1.c != x.c) return Col[x1.c]<Col[x.c];
return num[x1.n]<num[x.n];
}
Card Per[4][13];
void output(int i){
cout<<"+---+---+---+---+---+---+---+---+---+---+---+---+---+"<<endl;
for(int j = 0;j<13;j++)
cout<<"|"<<Per[i][j].n<<" "<<Per[i][j].n;
cout<<"|\n";
for(int j = 0;j<13;j++)
cout<<"| "<<Per[i][j].c<<" ";
cout<<"|\n";
for(int j = 0;j<13;j++)
cout<<"|"<<Per[i][j].n<<" "<<Per[i][j].n;
cout<<"|\n";
cout<<"+---+---+---+---+---+---+---+---+---+---+---+---+---+"<<endl;
}
int main(){
Col['C'] = 1;Col['D'] = 2;Col['S'] = 3;Col['H'] = 4;
num['2'] = 1;num['3'] = 2;num['4'] = 3;num['5'] = 4;num['6'] = 5;num['7'] = 6;num['8'] = 7;num['9'] = 8;
num['T'] = 9;num['J'] = 10;num['Q'] = 11;num['K'] = 12;num['A'] = 13;
p['S'] = 0;p['W'] = 1;p['N'] = 2;p['E'] = 3;
out[0] = "South player:\n";out[1] = "West player:\n";out[2] = "North player:\n";out[3] = "East player:\n";
while(1){
cin>>b;
if(b == '#') break;
int begin = (p[b] + 1)%4;
for(int j = 0;j<13;j++){
for(int i = 0;i<4;i++){
char c,n;
cin>>c>>n;
Card current = {c,n};
Per[begin][j] = current;
begin = (begin+1)%4;
}
}
for(int i = 0;i<4;i++){
cout<<out[i];
sort(Per[i],Per[i] + 13,cmp);
output(i);
}
cout<<'\n';
}
return 0;
}