ACM 实验室2020.10.10天梯赛练习*2
#define ll long long
//#define speed_up ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
using namespace std;
int main()
{
//speed_up;
int n;
cin>>n;
vector<string>v;
getchar();//不要忘了
while(n--)
{
string s="";
getline(cin,s);
cout<<s<<endl<<"AI:";
//替换大写字母 除了I都变小写,替换'?'
for(int i=0; i<s.size(); i++)
{
if(s[i]>='A'&&s[i]<='Z')//按照ascii码值分类
{
if(s[i]!='I')
s[i]+=32;
}
else if(s[i]=='?')
s[i]='!';
else if((s[i]>='0'&&s[i]<='9')||(s[i]>='a'&&s[i]<='z'))
continue;
else if(s[i]!=' ')//剩下的全为标点符号,标点的前面要加个空格
//否则会出现"I,don"这种连在一起的情况
{
s.insert(i," ");//插入函数
//s.insert(i+2," ");
i++;
}
}
int j=0;
string vv="";//存数组
for(int i=0; i<s.size(); i++)
{
vv+=s[i];
if((i==s.size()-1||s[i]==' ')&&vv!="")
{
v.push_back(vv);
j++;
vv="";
}
}
for(int i=0; i<j; i++)
{
if(v[i]=="I"||v[i]=="me")
v[i]="you";
}
for(int i=1; i<j; i++)
{
if(v[i-1]=="can"&&v[i]=="you")
{
v[i-1]="I";
v[i]="can";
}
if(v[i-1]=="could"&&v[i]=="you")
{
v[i-1]="I";
v[i]="could";
}
}
/*for(int i=0;i<j;i++)
{
cout<<v[i]<<endl;
}*/
vv="";
for(int i=0; i<j; i++)
{
vv=v[i];
{//不是标点
}
else//是标点(标点前面不输出空格)
{
if(i==0)cout<<" ";
cout<<v[i];
}
}
cout<<endl;
v.clear();
}
}
输入格式:
输入在一行中给出一句话,即一个非空字符串,由不超过 1000 个英文字母、数字和空格组成,以回车结束。
输出格式:
从左到右扫描输入的句子:如果句子中有超过 3 个连续的 6,则将这串连续的 6 替换成 9;但如果有超过 9 个连续的 6,则将这串连续的 6 替换成 27。其他内容不受影响,原样输出。
比赛时输入的方式不对,直接把每个单词存入string数组里了,这样最后一个字符如果是空格就输出不了了,而且没有考虑到可能出现一个单词同时有字符和数字6的情况,当出现这种情况时没有输出字符
string s[1000];
int i=0;
while(cin>>s[i])
{
if(cin.get()=='\n')break;
i++;
}
for(int j=0;j<=i;j++)
{
int m=0;
for(int k=0;k<s[j].length();k++)
{
if(s[j][k]=='6')m++;
}
if(m>3&&m<=9)cout<<"9";
else if(m>9)cout<<"27";
else cout<<s[j];
if(j!=i)cout<<" ";
}
cout<<endl;//错误代码,不能这样输入
#include<bits/stdc++.h>
#define ll long long
#define speed_up ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
using namespace std;
ll gcd(ll a,ll b)//
{
return b?gcd(b,a%b):a;
}
/*
*/
int main()
{
speed_up;
string s;
getline(cin,s);//输入带空格的字符串
int x=0;
for(int i=0;i<s.size();i++)
{
if(s[i]=='6')
{
x++;
if(i==s.size()-1)//当遍历到最后一位时的特殊情况
{
if(x>9)cout<<"27"; //当x超过9
if(x>3&&x<=9)cout<<"9";
if(x>0&&x<=3)//三个以下的6直接原样输出
{
while(x--)cout<<"6";
}
}
}
else//当下一位不是6时
{
if(x>9)cout<<"27";
if(x>3&&x<=9)cout<<"9";
if(x>0&&x<=3)
{
while(x--)cout<<"6";
}
x=0;
cout<<s[i];//输出这一位字符
}
}
cout<<endl;
}
{
string s;//名字
int a;//成绩
}d[100000];
{
if(x.a!=y.a)
return x.a>y.a;//成绩不相同,按从大到小排序
return x.s<y.s;//成绩相同,按名字首字母升序排序
}
#define ll long long
#define speed_up ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
using namespace std;
int f[100001];
set<int>s;//set集合记录人数
int find(int x)//并查集,把同一个部落的人标记为同一个数
{
if(x!=f[x])return f[x]=find(f[x]);
return x;
}
int main()
{
speed_up;
for(int i=1;i<=10000;i++)f[i]=i;
int t;
cin>>t;
while(t--)
{
int n,mm,m;
cin>>n;
cin>>mm;
s.insert(mm);
for(int i=1;i<n;i++)//把每一行的数标记为输入的第一个数的值
{
cin>>m;
s.insert(m);
f[find(m)]=mm;
}
cout<<s.size();//总人数
set<int>s2;
set<int>::iterator it;
for(it=s.begin();it!=s.end();it++)//再用一次find把编号等于下标的数统一为这个下标对应的编号
{
s2.insert(find(*it));//此时一个编号代表一个部落,相同编号的在同一个部落里
}
cout<<" "<<s2.size()<<endl;//部落个数
int l;
cin>>l;
for(int i=0;i<l;i++)
{
int a,b;
cin>>a>>b;
if(find(a)==find(b))
{
cout<<"Y"<<endl;
}
else cout<<"N"<<endl;
}
}
7-12 月饼 (25分)
没来得及做,补题的时候因为有一个地方多减了一遍没得全分
#include<bits/stdc++.h>
#define ll long long
#define speed_up ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
using namespace std;
struct cake
{
double sum;//库存量
double m;//总售价
double di;//总售价/库存量
}c[100010];
bool cmp(cake x,cake y)
{
return x.di>y.di;
}
int main()
{
speed_up;
int n,d;
cin>>n>>d;
for(int i=0;i<n;i++)
{
cin>>c[i].sum;
}
for(int i=0;i<n;i++)
{
cin>>c[i].m;
c[i].di=c[i].m/c[i].sum*1.0;
//cout<<b[i]<<endl;
}
double x=0;
sort(c,c+n,cmp);
//double sum=0;
for(int i=0;i<n;i++)
{
if(d>=c[i].sum)
{
d-=c[i].sum;
x+=c[i].m;
}
else
{
x+=d*c[i].di;
break;
}
//cout<<c[i].b<<endl;
}
printf("%.2f\n",x);
//cout<<x<<endl;
}