前五题较简单不写了
7-6:正整数A+B
评析:暴力字符串就行。恶心的是后面那个数中间可能有空格啊啊啊啊……,可悲的我一小时都没找到,所以我们要用getline(cin,t)来输入第二个数,cin会GG。
#include<bits/stdc++.h>
using namespace std;
string s,t;
int sum,f1,f2,len1,len2;
int main()
{
cin>>s;
getchar();
getline(cin,t);
len1=s.length();
len2=t.length();
//cout<<len1<<" "<<len2<<endl;
for (int i=0;i<len1;i++)
{
if (s[i]<'0' || s[i]>'9') f1=1;
}
for (int i=0;i<len2;i++)
{
if (t[i]<'0' || t[i]>'9') f2=1;
}
if (f1==0 && s[0]=='0') f1=1;
if (f2==0 && t[0]=='0') f2=1;
if (f1==0)
{
if (len1==1) sum+=s[0]-'0';
else if (len1==2) sum+=s[1]-'0'+10*(s[0]-'0');
else if (len1==3) sum+=s[2]-'0'+10*(s[1]-'0')+100*(s[0]-'0');
else if (len1==4 && s[0]=='1' && s[1]=='0' && s[2]=='0' && s[3]=='0') sum+=1000;
else f1=1;
}
if (f2==0)
{
if (len2==1) sum+=t[0]-'0';
else if (len2==2) sum+=t[1]-'0'+10*(t[0]-'0');
else if (len2==3) sum+=t[2]-'0'+10*(t[1]-'0')+100*(t[0]-'0');
else if (len2==4 && t[0]=='1' && t[1]=='0' && t[2]=='0' && t[3]=='0') sum+=1000;
else f2=1;
}
//cout<<f1<<" "<<f2<<endl;
if (f1==1) cout<<"? + ";
else cout<<s<<" + ";
if (f2==1) cout<<"? = ";
else cout<<t<<" = ";
if (f1==0 && f2==0) cout<<sum;
else cout<<"?";
}
7-7:打印沙漏
评析:模拟,算一算就好。要注意下面一半少一行。
#include<bits/stdc++.h>
using namespace std;
int n,m,t,sum,x;
char ch;
int main()
{
cin>>n>>ch;
if (n>0) x=n/2+1;
for (int i=1;i<=n;i++)
{
if ((n-((1+i)*(i/2+1)-1))>=0 && i % 2 != 0) t=i;
if ((n-((1+t)*(t/2+1)-1))<0)
{
t=t-2;
break;
}
}
int m=t;
for (int i=1;i<=t/2+1;i++)
{
for (int j=1;j<=sum;j++) cout<<" ";
for (int j=1;j<=m;j++) cout<<ch;
//for (int j=1;j<=sum;j++) cout<<" ";
cout<<endl;
sum++;
m-=2;
}
sum-=2;
m+=4;
for (int i=1;i<=t/2;i++)
{
for (int j=1;j<=sum;j++) cout<<" ";
for (int j=1;j<=m;j++) cout<<ch;
//for (int j=1;j<=sum;j++) cout<<" ";
cout<<endl;
sum--;
m+=2;
}
cout<<(n-((1+t)*(t/2+1)-1));
}
7-8:机工士姆斯塔迪奥
评析:用行乘列-重复的莫名又错了,不知为何,标记法就行。
#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10;
int f1[N],f2[N];
int main()
{
int n,m,q;
cin >> n >> m >> q;
while(q -- )
{
int a,b;
cin >> a >> b;
if(a == 0)
f1[b] = 1;
else
f2[b] = 1;
}
int res = 0;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
if(!f1[i] && !f2[j]) res ++;
cout << res << endl;
return 0;
}
7-9:排座位
评析:并查集的应用。把朋友放在一个并查集内即可。
#include <bits/stdc++.h>
using namespace std;
#define ll long long
const int mx=1e5+5;
int n,m,k;
int fa[1000];
int f[102][102];
void init()
{
for(int i=1;i<1000;i++)
{
fa[i]=i;
}
for(int i=0;i<102;i++)
{
for(int j=0;j<102;j++)
{
f[i][j]=0;
}
}
}
int findd(int x)
{
return (fa[x]==x)? x:fa[x]=findd(fa[x]);
}
void merge(int x,int y)
{
fa[findd(x)]=findd(fa[y]);
}
bool checkc(int x,int y)
{
return findd(fa[x])==findd(fa[y]);
}
int main()
{
init();
cin>>n>>m>>k;
for(int i=0;i<m;i++)
{
int x,y,z;
cin>>x>>y>>z;
if(z==1)
{
merge(x,y);
}
else if(z==-1)
{
f[x][y]=1;
f[y][x]=1;
}
}
for(int i=0;i<k;i++)
{
int x,y;
cin>>x>>y;
if(f[x][y]==1||f[y][x]==1)
{
if(checkc(x,y)) cout<<"OK but..."<<endl;
else cout<<"No way"<<endl;
}
else if(f[x][y]==0 && f[y][x]==0)
{
if(checkc(x,y)) cout<<"No problem"<<endl;
else cout<<"OK"<<endl;
}
}
}
7-10:名人堂与代金券
评析:结构体排序喽,考试时写了两个cmp,莫名的错了,相同时else return x.id<y.id不就好了吗,这都能错我也是十分佩服自己。
#include<bits/stdc++.h>
using namespace std;
int n,g,k,t,sum;
struct node
{
string id;
int mark;
int num;
}a[10005];
bool cmp(node x,node y)
{
if (x.mark != y.mark)return x.mark>y.mark;
else return x.id<y.id;
}
int main()
{
cin>>n>>g>>k;
for (int i=1;i<=n;i++)
{
cin>>a[i].id>>a[i].mark;
if (a[i].mark>=g && a[i].mark<=100) sum+=50;
else if (a[i].mark>=60 && a[i].mark<g) sum+=20;
}
sort (a+1,a+n+1,cmp);
a[1].num=1;
t=1;
for (int i=2;i<=n;i++)
{
if (a[i].mark<a[i-1].mark)
{
t++;
a[i].num=t;
}
else if (a[i].mark==a[i-1].mark)
{
a[i].num=a[i-1].num;
t++;
}
}
cout<<sum<<endl;
for (int i=1;i<=n;i++)
{
if (a[i].num<=k)
cout<<a[i].num<<" "<<a[i].id<<" "<<a[i].mark<<endl;
else break;
}
}
7-11:包装机
评析:模拟轨道物品顺序可以用queue来模型,而框可以用stack来模拟,而流水线可以用vector模拟
#include<bits/stdc++.h>
using namespace std;
queue<char>q[102];
stack<char>s;
int main()
{
int n,m,z;
cin>>n>>m>>z;
char c;
for(int i=1;i<=n;i++)
{
for(int j=0;j<m;j++)
{
cin>>c;
q[i].push(c);
}
}
int x;
while(cin>>x&&x!=-1)
{//分成=0或!=0两种情况分类讨论
if(x!=0)
{
if(q[x].size()>0)
{
if(s.size()<z)
{s.push(q[x].front());q[x].pop();}
else if(s.size()>=z)
{
cout<<s.top();s.pop();
s.push(q[x].front());q[x].pop();
}
}
}
else
{
if(s.size()>0){cout<<s.top();s.pop();}
}
}
return 0;
}
7-12:愿天下有情人都是失散多年的兄妹
评析:这题名字……针对性很强……不算太难的dfs,做起来有点麻烦,但是能做。需注意的是,题目输入数据时,对于某人的父母性别信息未给出,也就是说对于父母性别我们需要额外设置
#include<bits/stdc++.h>
using namespace std;
int n,k;
struct node
{
char sex;
int father,mother;
int valid;
}p[100100];
int flag;
void init()
{
for(int i = 0; i < 100100; i++) p[i].valid = 0;
}
void dfs(int s,int a,int b)
{
if(!flag) return;
if(a == -1 || b == -1) return;
if(a == b)
{
if(s <= 5) flag = 0;
return;
}
if(s > 5) return;
if(!p[a].valid || !p[b].valid) return;
dfs(s+1,p[a].father,p[b].father);
dfs(s+1,p[a].father,p[b].mother);
dfs(s+1,p[a].mother,p[b].mother);
dfs(s+1,p[a].mother,p[b].father);
}
int main()
{
init();
cin >> n;
for(int i = 0; i < n; i++)
{
int id,fa,mo;
char se;
cin >> id >> se >> fa >> mo;
p[id].sex = se;
p[id].father = fa;
p[id].mother = mo;
p[id].valid = 1;
if(fa != -1) p[fa].sex = 'M';
if(mo != -1) p[mo].sex = 'F';
}
cin >> k;
while(k--)
{
int a,b;
cin >> a >> b;
if(p[a].sex == p[b].sex)
{
printf("Never Mind\n");
}
else
{
flag = 1;
dfs(1,a,b);
if(flag) printf("Yes\n");
else printf("No\n");
}
}
return 0;
}