STL初探中的初探
STL初探中的初探
梳理一下几道例题
Uva10474 Where is the Marble
。。。
都不想说什么,贴代码
#include<bits/stdc++.h>
using namespace std;
int a[100005];
int n,q;
int cnt=0;
int main()
{
while(scanf("%d%d",&n,&q)==2 && n!=0 && q!=0)
{
cnt++;
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
}
sort(a+1,a+1+n);
cout<<"CASE# "<<cnt<<":"<< endl;
for(int i=1;i<=q;i++)
{
int x;
scanf("%d",&x);
int pos=lower_bound(a+1,a+1+n,x)-a;
if(x==a[pos])
{
cout << x << " " <<"found" << " "<< "at" << " "<<pos << endl;
}
else{
cout <<x<<" "<<"not"<<" "<<"found"<< endl;
}
}
}
return 0;
}
sort和lower_bound的基本运用
过
Uva101 The Blocks Problem
这道题有搞头,我肝了一个晚上(掩面而泣)
由题意我们发现,当指令中有"onto"时,b会被拿到最上面,而当指令中有move时,a会被拿到嘴上卖面,这可以大大精简代码量,若不精简,会因玄学导致RE,由于这里数组大小不定则使用vector。
#include<bits/stdc++.h>
const int maxn = 30;
using namespace std;
int n;
vector<int> sta[maxn];
vector<int>::iterator it;
int pos[maxn];
void moveall(int num,int p1,int p2)
{
for(it=find(sta[p1].begin(),sta[p2].end(),num);it!=sta[p1].end();it++)
{
int x=*it;
sta[p2].push_back(x);
pos[x]=p2;
}
it=find(sta[p1].begin(),sta[p2].end(),num);
sta[p1].erase(it,sta[p1].end());
}
void putdown(int num,int p)
{
it=find(sta[p].begin(),sta[p].end(),num);
int x=*it;
sta[p].erase(it);
sta[p].push_back(x);
}
void move_onto(int a,int b)
{
int pos1=pos[a];
int pos2=pos[b];
if(pos1==pos2) return;
putdown(a,pos1);
putdown(b,pos2);
it=sta[pos1].end()-1;
int x=*it;
sta[pos1].pop_back();
sta[pos2].push_back(x);
pos[x]=pos2;
}
void move_over(int a,int b)
{
int pos1=pos[a];
int pos2=pos[b];
if(pos1==pos2) return;
putdown(a,pos1);
it=sta[pos1].end()-1;
int x=*it;
sta[pos1].pop_back();
sta[pos2].push_back(x);
pos[x]=pos2;
}
void pile_onto(int a,int b)
{
int pos1=pos[a];
int pos2=pos[b];
if(pos1==pos2) return;
putdown(b,pos2);
moveall(a,pos1,pos2);
}
void pile_over(int a,int b)
{
int pos1=pos[a];
int pos2=pos[b];
if(pos1==pos2) return;
moveall(a,pos1,pos2);
}
int main()
{
cin >> n;
for(int i=0;i<n;i++){
sta[i].push_back(i);
pos[i]=i;
}
string s1,s2;
int a,b;
while(cin >> s1)
{
if(s1=="quit") break;
cin >> a >> s2 >>b;
if(s1=="move")
{
if(s2=="onto") move_onto(a,b);
else move_over(a,b);
}
else if(s1=="pile"){
if(s2=="onto")pile_onto(a,b);
else pile_over(a,b);
}
}
for(int i=0;i<n;i++)
{
printf("%d: ",i);
for(it=sta[i].begin();it!=sta[i].end();it++)
{
printf("%d ",*it);
}
printf("\n");
}
return 0;
}
这是之前的代码
#include<bits/stdc++.h>
using namespace std;
int n;
vector<int>sta[30];
int find_p(int x)
{
for(int i=0;i<n;i++)
{
for(int j=0;j<sta[i].size();j++)
{
if(sta[i][j]==x) return i;
}
}
}
int find_h(int x)
{
for(int i=0;i<n;i++)
{
for(int j=0;j<sta[i].size();j++)
{
if(sta[i][j]==x) return j;
}
}
}
void onto(int p1,int h,int p2)
{
for(int i=h;i<sta[p1].size();i++)
{
sta[p2].push_back(sta[p1][i]);
}
sta[p1].resize(h);
}
void doing(int p,int h)
{
for(int i=h+1;i<sta[p].size();i++)
{
int where = sta[p][i];
sta[where].push_back(where);
}
sta[p].resize(h+1);
}
int main()
{
cin >> n;
for(int i=0;i<n;i++)
{
sta[i].push_back(i);
}
string s1,s2;
int a,b;
while(cin >> s1)
{
if(s1=="quit") break;
cin >> a >> s2 >> b;
int p1=find_p(a);
int p2=find_p(b);
int h1=find_h(a);
int h2=find_h(b);
if(p1==p2) continue;
if(s1=="move") doing(p1,h1);
if(s2=="onto") doing(p2,h2);
onto(p1,h1,p2);
}
for(int i=0;i<n;i++)
{
printf("%d:",i);
for(int j=0;j<sta[i].size();j++)
{
printf(" %d",sta[i][j]);
}
printf("\n");
}
return 0;
}
这是之后的代码
理解了其实很简单
Uva156 Ananagrams
这题是map的基本应用,还有,谁重排谁zz,标准化之后再push进map里就行了,代码很简单
#include<bits/stdc++.h>
using namespace std;
map<string,int> cnt;
vector<string> words;
string repr(const string& s)
{
string ans=s;
for(int i=0;i< ans.length();i++)
ans[i]=tolower(ans[i]);
sort(ans.begin(), ans.end());
return ans;
}
int main()
{
int n = 0;
string s;
while(cin >> s){
if(s[0]=='#') break;
words.push_back(s);
string r = repr(s);
if(!cnt.count(r)) cnt[r]=0;
cnt[r]++;
}
vector<string> ans;
for(int i=0;i<words.size();i++)
if(cnt[repr(words[i])] == 1) ans.push_back(words[i]);
sort(ans.begin(),ans.end());
for(int i=0;i<ans.size();i++)
cout << ans[i] << "\n";
return 0;
}