一共五道算法编程题,120min,难度还算ok,简单到中等吧,就是要自己写输入输出什么的有点儿麻烦,第一题看错题了,浪费了将近一个小时…直接导致最后一个题没时间做。还是我太菜。
小美现在有一个长度为n的数组,数组仅包含正整数,小美可以选择一个数字k,数组中数字大小满足在[k-1,k+1]之间的数字数量就是小美能够获得的礼物总量,小美希望最大化可以获得的礼物总量。
输入描述
第一行一个正整数n,表示数组长度
第二行n个空格分隔的正整数表示数组中的每个正整数
1<=n<=100000,每个数字保证在[1,100]之间
输出描述
一个正整数表述小美最多能获得的礼物数量
样例输入
6
1 2 2 3 5 5
样例输出
4
int main()
{
int n;
int max = 0;
cin>>n;
vector<int> nums;
for(int i=0;i<n;i++)
{
int a;
cin>>a;
nums.push_back(a);
}
for(int i=0;i<nums.size();i++)
{
int count = 0;
for(int j=0;j<nums.size();j++)
{
if(nums[j]>=nums[i]-1&&nums[j]<=nums[i]+1)
{
++count;
if(count>max)
{
max = count;
}
}
}
}
cout<<max<<endl;
return 0;
}
现在你位于(1,1),目标是(n,m),只能向右或向下移动,每次可以在给定区域内移动一个单位,其中小写字母o是已探明区域,小写字母x是未探明区域。要求尽量在已探明区域移动,找出使得未探明区域尽量少的航线,输出这条航线上的未探明区域数量。
输入描述
第一行两个正整数n和m,描述给定区域大小。接下来n行m列字符描述给定区域探明情况。其中保证(1,1)和(n,m)是已探明区域。
1<=n,m<=200
输出描述
一个正整数表示航线最少经历几个未探明区域
样例输入
5 5
oxxxx
xxoox
oooxo
xxxxo
ooooo
样例输出
2
char tmap[200][200];
int searchh(int i,int j,int res)
{
if(i== 1&&j==1)
{
return res;
}
if(i==1)
{
if(tmap[i][j+1]=='o')
{
return searchh(i,j+1,res);
}
if(tmap[i][j+1]=='x')
{
return searchh(i,j+1,res+1);
}
}
if(j==1)
{
if(tmap[i+1][j]=='o')
{
return searchh(i+1,j,res);
}
if(tmap[i+1][j]=='x')
{
return searchh(i+1,j,res+1);
}
}
if(tmap[i+1][j]=='o'&&tmap[i][j+1]=='x')
{
return searchh(i+1,j,res);
}
if(tmap[i+1][j]=='x'&&tmap[i][j+1]=='o')
{
return searchh(i,j+1,res);
}
if(tmap[i+1][j]=='o'&&tmap[i][j+1]=='o')
{
return searchh(i+1,j,res)>searchh(i,j+1,res)?searchh(i,j+1,res):searchh(i+1,j,res);
}
if(tmap[i+1][j]=='x'&&tmap[i][j+1]=='x')
{
return searchh(i+1,j,res+1)>searchh(i,j+1,res+1)?searchh(i,j+1,res+1):searchh(i+1,j,res+1);
}
}
int main()
{
int m,n;
cin>>m>>n;
for(int i=0;i<m;i++)
{
for(int j=0;j<n;j++)
{
cin>>tmap[i][j];
}
}
cout<<searchh(0,0,0);
return 0;
}
现在给你n个字符,每个字符只能是+或-的一种,可以替换掉不超过k个字符,将+变成-或者将-变成+,使得连续的+最多,求此时最长的连续+的数量
输入描述
第一行两个正整数n和k,表示字符串长度为n,可以替换的字符数量不超过k个。
第二行是一个长度为n的字符串,其中仅有+或-
1<=n,k<=10000
输出描述
一个正整数表示替换不超过k个字符的情况下可以获得的最长连续+的数量
样例输入
10 2
–+±-++±
样例输出
7
int main()
{
int m,n;
string s;
int max=0;
cin>>s;
cin>>m>>n;
for(int i=0;i<m;i++)
{
int count = 0,k=n;
for(int j=i;j<m;j++)
{
if(s[j]=='+')
{
++count;
}
else if(s[j]=='-')
{
if(k>0)
{
--k;
++count;
}
else
{
break;
}
}
}
max = max > count ? max : count;
}
cout<<max<<endl;
return 0;
}
小美在经营一家奶茶店,奶茶店每天会有大量的销售额,这会影响接下来的备货策略,完成小美在查询时的结果
输入描述
第一行两个正整数n和q,n表示奶茶品牌数量,q表示操作命令数量。
第二行n个空格隔开的正整数,表示每个奶茶品牌的单价利润。
接下来q个操作,每个操作均为下列中的一种:
Add x y:品牌x的奶茶增加销量y。
Query BestSales:查询当前操作为止销量最多的品牌,不唯一则输出编号最小的
Query BestProfit:查询当前操作为止利润最多的品牌,不唯一则输出编号最小的
1<=n<=100000,1<=q<=500
输出描述
对每个查询返回正确结果
样例输入
2 6
1 2
Add 1 3
Add 2 2
Query BestSales
Query BestProfit
Add 1 1
Query BestProfit
样例输出
1
2
1
struct mt
{
int brand;
int count;
int profit;
};
bool cmp1(mt n1,mt n2)
{
if(n1.count!=n2.count)
{
return n1.count>n2.count;
}
else
{
return n1.brand<n2.brand;
}
}
bool cmp2(mt n1,mt n2)
{
int r1 = n1.count*n1.profit;
int r2 = n2.count*n2.profit;
if(r1!=r2)
{
return r1>r2;
}
else
{
return n1.brand<n2.brand;
}
}
int main()
{
int n,q;
cin>>n>>q;
vector<mt> tea;
for(int i=0;i<n;i++)
{
mt a;
a.brand = i+1;
a.count = 0;
cin>>a.profit;
tea.push_back(a);
}
for(int i=0;i<=q;i++)
{
string s;
string s1 = "Query BestSales";
string s2 = "Query BestProfit";
getline(cin,s);
if(s==s1)
{
sort(tea.begin(),tea.end(),cmp1);
mt *temp = &tea[0];
cout<<temp->brand<<endl;
}
else if(s==s2)
{
sort(tea.begin(),tea.end(),cmp2);
mt *tmp = &tea[0];
cout<<tmp->brand<<endl;
}
else if(s.find("Add")!=string::npos)
{
int pos = s.find(" ");
string num = s.substr(pos+1);
int tpos = num.find(" ");
string as = num.substr(0,tpos);
string bs = num.substr(tpos+1);
int a = atoi(as.c_str());
int b = atoi(bs.c_str());
for(int i=0;i<tea.size();i++)
{
mt *tp = &tea[i];
if(tp->brand == a)
{
tp->count += b;
}
}
}
}
return 0;
}
现在有n个游戏参与活动,编号为1…n,小美和小团要从n个游戏中进行挑选,由于他们可以一起玩耍,所以每个游戏至多买一份就可以。但小美和小团对每个游戏的喜爱有所不同,他们希望最终购买的游戏中,至少有x个是小美喜欢的,且至少有x个是小团喜欢的。现给出每个游戏的售价以及二人所喜爱的游戏,请问至少需要花费多少钱才能满足上述需求。
输入描述
第一行两个正整数n和x,表示有n个游戏以及题目中描述的x
第二行n个正整数,表示第i个游戏的售价ci
第三行一个正整数a表示小美喜欢的游戏个数
第四行a个正整数表示小美喜欢的游戏编号
第五行一个正整数b表示小团喜欢的游戏个数
第六行b个正整数表示小团喜欢的游戏编号
1<=x<=n<=100000,1<=ci<=1000
输出描述
输出一个数,如果可以满足上述需求,输出最小花费,否则输出-1。
样例输入
5 2
1 1 2 1 2
3
1 3 2
3
1 2 4
样例输出
2
struct game{
int id;
int price;
};
bool cmp1(game g1,game g2)
{
if(g1.price!=g2.price)
{
return g1.price<g2.price;
}
else
{
return g1.id<g2.id;
}
}
int main()
{
int ans = 0;
int n,x;
cin>>n>>x;
vector<game> g;
for(int i=0;i<n;i++)
{
game tmp;
tmp.id = i+1;
int tmprice;
cin>>tmprice;
tmp.price = tmprice;
g.push_back(tmp);
}
int a;
cin>>a;
vector<game> mei;
vector<game> tuan;
for(int i=0;i<a;i++)
{
int tmp;
cin>>tmp;
game meitmp;
meitmp.id = tmp;
for(int j=0;j<g.size();j++)
{
game *tp = &g[j];
if(tp->id==tmp)
{
meitmp.price = tp->price;
}
}
mei.push_back(meitmp);
}
int b;
cin>>b;
for(int i=0;i<b;i++)
{
int tmp;
cin>>tmp;
game tuantmp;
tuantmp.id = tmp;
for(int j=0;j<g.size();j++)
{
game *tp = &g[j];
if(tp->id==tmp)
{
tuantmp.price = tp->price;
}
}
tuan.push_back(tuantmp);
}
sort(mei.begin(),mei.end(),cmp1);
sort(tuan.begin(),tuan.end(),cmp1);
vector<int> pos_rec;
for(int i=0;i<mei.size();i++)
{
game *mtmp = &mei[i];
game *ttmp = &tuan[i];
if(mtmp->id==ttmp->id)
{
ans += mtmp->price;
x--;
pos_rec.push_back(i);
}
}
int t = pos_rec.size();
int pos = pos_rec[t];
while(x!=0)
{
game *mtmp = &mei[pos];
game *ttmp = &tuan[pos];
ans+=mtmp->price;
ans+=ttmp->price;
x--;
pos++;
}
cout<<ans<<endl;
return 0;
}
前段时间开始刷LeetCode,一直没有注意对输入输出的处理,这次笔试主要是对输入输出处理不当,字符串处理还需加强,不要再看错题了啊!!!
加油!