PAT的题目解析总结一
1001 A+B Format
to_string()函数的使用,可以使一个数字转换为字符串形式
将添加逗号的位置问题转换为数学问题:((i+1)%3==len%3)&&i!=len-1
1002 A+B for Polynomials
模拟题目:简单的多项式加法,可以使用数组存储,来一项,就加一项
1003 Emergency
Dijkstra算法,混合了最短路径的条数,以及点权问题。
if(!vis[v]&&e[u][v]!=inf){
if(e[u][v]+dis[u]<dis[v]){
dis[v]=e[u][v]+dis[u];
num[v]=num[u];
w[v]=w[u]+weight[v];
}else if(e[u][v]+dis[u]==dis[v]){
num[v]+=num[u];
if(w[u]+weight[v]>w[v]){
w[v]=w[u]+weight[v];
}
}
1004 Counting Leaves
每一层有多少个叶子节点
void dfs(int index,int depth){
if(v[index].size()==0){
book[depth]++;
maxdepth=max(depth,maxdepth);
return;
}
for(int i=0;i<v[index].size();++i){
dfs(v[index][i],depth+1);
}
}
1005 Spell It Right
水题
1006 Sign In and Sign Out
水题
1007 Maximum Subsequence Sum
最大子序列和,《数据结构与算法》C语言版上的第一道算法题,上面有三种解法🧐
vector<int> v(n);
int leftindex=0,rightindex=n-1,sum=-1,temp=0,tempIndex=0;
for(int i=0;i<n;++i){
cin>>v[i];
temp+=v[i];
if(temp<0){
temp=0;
tempIndex=i+1;
}else if(temp>sum){
sum=temp;
leftindex=tempIndex;
rightindex=i;
}
}
1008 Elevator
水题
1009 Product of Polynomials
译为多项式积
输入一个项就对全体数组都乘一遍
#include <iostream>
using namespace std;
int main(){
int n1,n2,a,cnt=0;
cin>>n1;
double b,arr[1001]={0},ans[2001]={0};
for(int i=0;i<n1;++i){
cin>>a>>b;
arr[a]=b;
}
cin>>n2;
for(int i=0;i<n2;++i){
cin>>a>>b;
for(int j=0;j<1001;++j){
ans[j+a]+=arr[j]*b;
}
}
for(int i=2000;i>=0;--i){
if(ans[i]!=0) ++cnt;
}
printf("%d",cnt);
for(int i=2000;i>=0;--i){
if(ans[i]!=0) printf(" %d %.1f",i,ans[i]);
}
return 0;
}
1010 Radix
难顶,我是一名保安,爱吃压缩饼干。
max_element(s.begin,s.end),用来查找区间内的最大值的地址,加上“*”号则表示对应地址的值。
#include <iostream>
#include <cctype>
#include <algorithm>
#include <cmath>
using namespace std;
long long convert(string n,long long radix){
long long sum=0;
int index=0,temp=0;
for(auto it=n.rbegin();it!=n.rend();++it){
temp=isdigit(*it)?*it-'0':*it-'a'+10;
sum+=temp*pow(radix,index++);
}
return sum;
}
long long find_radix(string n,long long num){
char it=*max_element(n.begin(),n.end());
long long low=(isdigit(it)?it-'0':it-'a'+10)+1;
long long high=max(num,low);
while(low<=high){
long long mid=(low+high)/2;
long long t=convert(n,mid);
if(t<0||t>num) high=mid-1;
else if(t==num) return mid;
else low=mid+1;
}
return -1;
}
int main(){
string n1,n2;
long long tag=0,radix=0,result_radix;
cin>>n1>>n2>>tag>>radix;
result_radix=tag==1?find_radix(n2,convert(n1,radix)):
find_radix(n1,convert(n2,radix));
if(result_radix!=-1){
printf("%lld",result_radix);
}else printf("Impossible");
return 0;
}
1011 World Cup Betting
水题
1012 The Best Rank
这又是麻烦题,最近考试考的越来越多了
#include <iostream>
#include <algorithm>
using namespace std;
struct node{
int id,best;
int score[4],rank[4];
}stu[2005];
int exist[1000000],flag=-1;
bool cmp1(node a,node b){
return a.score[flag]>b.score[flag];
}
int main(){
int n,m,id;
cin>>n>>m;
for(int i=0;i<n;++i){
cin>>stu[i].id>>stu[i].score[1]>>stu[i].score[2]>>stu[i].score[3];
stu[i].score[0]=(stu[i].score[1]+stu[i].score[2]+stu[i].score[3]+0.5)/3.0;
}
for(flag=0;flag<=3;++flag){
sort(stu,stu+n,cmp1);
stu[0].rank[flag]=1;
for(int i=1;i<n;++i){
stu[i].rank[flag]=i+1;
if(stu[i].score[flag]==stu[i-1].score[flag]){
stu[i].rank[flag]=stu[i-1].rank[flag];
}
}
}
for(int i=0;i<n;++i){
exist[stu[i].id]=i+1;
stu[i].best=0;
int minn=stu[i].rank[0];
for(int j=1;j<=3;++j){
if(stu[i].rank[j]<minn){
minn=stu[i].rank[j];
stu[i].best=j;
}
}
}
char c[5]={'A','C','M','E'};
for(int i=0;i<m;++i){
cin>>id;
int temp=exist[id];
if(temp){
int best=stu[temp-1].best;
printf("%d %c\n",stu[temp-1].rank[best],c[best]);
}else printf("N/A\n");
}
return 0;
}
1013 Battle Over Cities
检查图的连通块的个数—>常规做法就是并查集或者DFS,这里使用DFS,因为代码量小
#include <iostream>
#include <algorithm>
using namespace std;
int v[1010][1010];
bool visit[1010];
int n;
void dfs(int node){
visit[node]=1;
for(int i=1;i<=n;++i){
if(!visit[i]&&v[node][i]==1){
dfs(i);
}
}
}
int main(){
int m,k,a,b;
cin>>n>>m>>k;
for(int i=0;i<m;++i){
cin>>a>>b;
v[a][b]=v[b][a]=1;
}
for(int i=0;i<k;++i){
fill(visit,visit+1010,false);
cin>>a;
int cnt=0;
visit[a]=1;
for(int j=1;j<=n;++j){
if(!visit[j]){
dfs(j);
++cnt;
}
}
printf("%d\n",cnt-1);
}
return 0;
}
1014 Waiting in Line
快乐模拟题?再见,有空在看
1015 Reversible Primes
#include <iostream>
using namespace std;
bool isPrime(int x){
if(x<=1) return false;
for(int i=2;i*i<=x;++i){
if(x%i==0) return false;
}
return true;
}
int main(){
int n,d;
while(scanf("%d",&n)!=EOF){
if(n<0) break;
scanf("%d",&d);
if(isPrime(n)==false){
printf("No\n");
continue;
}
int len=0,arr[100];
do{
arr[len++]=n%d;
n/=d;
}while(n!=0);
for(int i=0;i<len;++i){
n=n*d+arr[i];
}
printf("%s\n",isPrime(n)?"Yes":"No");
}
return 0;
}
1016 Phone Bills
排序题+麻烦题,麻烦题算是pat的传统了,这是陈越姥姥早期驯服PAT的珍贵资料
要有个清晰的思路,加上对map、string、set等STL的熟练掌握
#include <iostream>
#include <map>
#include <vector>
#include <algorithm>
using namespace std;
struct node{
string name;
int status,month,time,day,hour,minute;
};
bool cmp(node a,node b){
return a.name!=b.name?a.name<b.name:a.time<b.time;
}
double billFromZero(node call,int*rate){
double total=rate[call.hour]*call.minute+rate[24]*60*call.day;
for(int i=0;i<call.hour;++i){
total+=rate[i]*60;
}
return total/100.0;
}
int main(){
int rate[25]={0},n;
for(int i=0;i<24;++i){
scanf("%d",&rate[i]);
rate[24]+=rate[i];
}
scanf("%d",&n);
vector<node> data(n);
for(int i=0;i<n;++i){
cin>>data[i].name;
scanf("%d:%d:%d:%d",&data[i].month,&data[i].day,&data[i].hour,&data[i].minute);
string temp;
cin>>temp;
data[i].status=(temp=="on-line")?1:0;
data[i].time=data[i].day*24*60+data[i].hour*60+data[i].minute;
}
sort(data.begin(),data.end(),cmp);
map<string,vector<node>> custom;
for(int i=1;i<n;++i){
if(data[i].name==data[i-1].name&&data[i-1].status&&!data[i].status){
custom[data[i-1].name].push_back(data[i-1]);
custom[data[i].name].push_back(data[i]);
}
}
for(auto it:custom){
vector<node> temp=it.second;
cout<<it.first;
printf(" %02d\n",temp[0].month);
double total=0;
for(int i=1;i<temp.size();i+=2){
double t=billFromZero(temp[i],rate)-billFromZero(temp[i-1],rate);
printf("%02d:%02d:%02d %02d:%02d:%02d %d $%.2f\n",temp[i-1].day,
temp[i-1].hour,temp[i-1].minute,temp[i].day,temp[i].hour,temp[i].minute,
temp[i].time-temp[i-1].time,t);
total+=t;
}
printf("Total amount: $%.2f\n",total);
}
return 0;
}
1017 Queueing at Bank
又是快乐模拟,溜了溜了
1018 Public Bike Management
这个Dijkstra太变态。。。
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
const int inf=1e9;
int cmax,n,sp,m;
int minNeed=inf,minBack=inf;
int e[510][510],dis[510],weight[510];
bool vis[510];
vector<int> pre[510];
vector<int> path,temppath;
void dfs(int v){
temppath.push_back(v);
if(v==0){
int need=0,back=0;
for(int i=temppath.size()-1;i>=0;--i){
int id=temppath[i];
if(weight[id]>0){
back+=weight[id];
}else{
if(back>(0-weight[id])){
back+=weight[id];
}else{
need+=((0-weight[id])-back);
back=0;
}
}
}
if(need<minNeed){
minNeed=need;
minBack=back;
path=temppath;
}else if(need==minNeed&&back<minBack){
minBack=back;
path=temppath;
}
temppath.pop_back();
return;
}
for(int i=0;i<pre[v].size();++i){
dfs(pre[v][i]);
}
temppath.pop_back();
}
int main(){
fill(e[0],e[0]+510*510,inf);
fill(dis,dis+510,inf);
cin>>cmax>>n>>sp>>m;
for(int i=1;i<=n;++i){
cin>>weight[i];
weight[i]=weight[i]-cmax/2;
}
for(int i=0;i<m;++i){
int a,b;
cin>>a>>b;
cin>>e[a][b];
e[b][a]=e[a][b];
}
dis[0]=0;
for(int i=0;i<=n;++i){
int u=-1,minn=inf;
for(int j=0;j<=n;++j){
if(!vis[j]&&dis[j]<minn){
minn=dis[j];
u=j;
}
}
if(u==-1) break;
vis[u]=1;
for(int v=0;v<=n;++v){
if(!vis[v]&&e[u][v]!=inf){
if(dis[v]>e[u][v]+dis[u]){
dis[v]=e[u][v]+dis[u];
pre[v].clear();
pre[v].push_back(u);
}else if(dis[v]==e[u][v]+dis[u]){
pre[v].push_back(u);
}
}
}
}
dfs(sp);
printf("%d 0",minNeed);
for(int i=path.size()-2;i>=0;--i){
printf("->%d",path[i]);
}
printf(" %d",minBack);
return 0;
}
1019 General Palindromic Number
回文串的基本操作
#include <iostream>
using namespace std;
int main(){
int a,b;
cin>>a>>b;
int arr[40],index=0;
while(a!=0){
arr[index++]=a%b;
a/=b;
}
int flag=0;
for(int i=0;i<index/2;++i){
if(arr[i]!=arr[index-i-1]){
printf("No\n");
flag=1;
break;
}
}
if(!flag) printf("Yes\n");
for(int i=index-1;i>=0;--i){
printf("%d",arr[i]);
if(i!=0) printf(" ");
}
if(index==0) printf("0");
return 0;
}
1020 Tree Traversals
这个是典型具有柳神建树气息的代码。
while函数在中序遍历中根节点的位置,最后end-i为右节点的个数,i-start为左节点的个数。
所以,建立左树时,左根节点是现在的位置减去右节点的个数-1,root-end+i-1。
其余的懂得都懂
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
struct node{
int index,value;
};
bool cmp(node a,node b){
return a.index<b.index;
}
vector<int> post,in;
vector<node> ans;
void pre(int root,int start,int end,int index){
if(start>end) return;
int i=start;
while(i<end&&in[i]!=post[root]) ++i;
ans.push_back({index,post[root]});
pre(root-1-end+i,start,i-1,2*index+1);
pre(root-1,i+1,end,2*index+2);
}
int main(){
int n;
cin>>n;
post.resize(n);
in.resize(n);
for(int i=0;i<n;++i) cin>>post[i];
for(int i=0;i<n;++i) cin>>in[i];
pre(n-1,0,n-1,0);
sort(ans.begin(),ans.end(),cmp);
for(int i=0;i<ans.size();++i){
if(i!=0) cout<<" ";
cout<<ans[i].value;
}
return 0;
}
1021 Deepest Root
两次dfs,所求最高的叶子节点,即为所求
#include <iostream>
#include <vector>
#include <set>
#include <algorithm>
using namespace std;
int n,maxheight=0;
vector<vector<int>> v;
bool vis[10010];
set<int> s;
vector<int> temp;
void dfs(int node,int height){
if(height>maxheight){
temp.clear();
temp.push_back(node);
maxheight=height;
}else if(height==maxheight){
temp.push_back(node);
}
vis[node]=1;
for(int i=0;i<v[node].size();++i){
if(!vis[node][i]) dfs(v[node][i],height+1);
}
}
int main(){
cin>>n;
v.resize(n+1);
int a,b,cnt=0,s1=0;
for(int i=0;i<n-1;++i){
cin>>a>>b;
v[a].push_back(b);
v[b].push_back(a);
}
for(int i=1;i<=n;++i){
if(!vis[i]){
dfs(i,1);
if(i==1){
if(temp.size()!=0) s1=temp[0];
for(int j=0;j<temp.size();++j){
s.insert(temp[j]);
}
}
++cnt;
}
}
if(cnt>=2){
printf("Error: %d components",cnt);
}else{
temp.clear();
maxheight=0;
fill(vis,vis+10010,false);
dfs(s1,1);
for(int i=0;i<temp.size();++i){
s.insert(temp[i]);
}
for(auto it=s.begin();it!=s.end();++it){
printf("%d\n",*it);
}
}
return 0;
}
1022 Digital Library
map排序复杂题
#include <iostream>
#include <map>
#include <set>
using namespace std;
map<string,set<int>> title,author,key,pub,year;
void query(map<string,set<int>>&m,string&str){
if(m.find(str)!=m.end()){
for(auto it=m[str].begin();it!=m[str].end();++it){
printf("%07d\n",*it);
}
}else{
cout<<"Not Found\n";
}
}
int main(){
int n,m,id,num;
cin>>n;
string ttitle,tauthor,tkey,tpub,tyear;
for(int i=0;i<n;++i){
scanf("%d\n",&id);
getline(cin,ttitle);
title[ttitle].insert(id);
getline(cin,tauthor);
author[tauthor].insert(id);
while(cin>>tkey){
key[tkey].insert(id);
char c=getchar();
if(c=='\n') break;
}
getline(cin,tpub);
pub[tpub].insert(id);
getline(cin,tyear);
year[tyear].insert(id);
}
cin>>m;
for(int i=0;i<m;++i){
scanf("%d: ",&num);
string temp;
getline(cin,temp);
cout<<num<<": "<<temp<<"\n";
if(num==1) query(title,temp);
else if(num==2) query(author,temp);
else if(num==3) query(key,temp);
else if(num==4) query(pub,temp);
else if(num==5) query(year,temp);
}
return 0;
}
1023 Have Fun with Numbers
#include <iostream>
#include <cstring>
using namespace std;
int book[10];
int main(){
char num[22];
scanf("%s",num);
int flag=0,len=strlen(num);
for(int i=len-1;i>=0;--i){
int temp=num[i]-'0';
++book[temp];
temp=temp*2+flag;
flag=0;
if(temp>=10){
temp=temp-10;
flag=1;
}
num[i]=temp+'0';
--book[temp];
}
int flag1=0;
for(int i=0;i<10;++i){
if(book[i]!=0) flag1=1;
}
printf("%s",(flag==1||flag1==1)?"No\n":"Yes\n");
if(flag==1) printf("1");
printf("%s",num);
return 0;
}
1024 Palindromic Number
string用于解决回文串真是优秀啊
#include <iostream>
#include <algorithm>
using namespace std;
string s;
void add(string t){
int len=s.length(),carry=0;
for(int i=0;i<len;++i){
s[i]=s[i]+t[i]+carry-'0';
carry=0;
if(s[i]>'9'){
s[i]=s[i]-10;
carry=1;
}
}
if(carry) s+='1';
reverse(s.begin(),s.end());
}
int main(){
int cnt,i;
cin>>s>>cnt;
for(i=0;i<=cnt;++i){
string t=s;
reverse(t.begin(),t.end());
if(s==t||i==cnt) break;
add(t);
}
cout<<s<<endl<<i;
return 0;
}
1025 PAT Ranking
排序题
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
struct student{
long long int no;
int score,finrank,loca,locarank;
};
bool cmp(student a,student b){
return a.score!=b.score?a.score>b.score:a.no<b.no;
}
int main(){
int n,m;
cin>>n;
vector<student> fin;
for(int i=1;i<=n;++i){
cin>>m;
vector<student> v(m);
for(int j=0;j<m;++j){
cin>>v[j].no>>v[j].score;
v[j].loca=i;
}
sort(v.begin(),v.end(),cmp);
v[0].locarank=1;
fin.push_back(v[0]);
for(int j=1;j<m;++j){
v[j].locarank=(v[j].score==v[j-1].score)?v[j-1].locarank:j+1;
fin.push_back(v[j]);
}
}
sort(fin.begin(),fin.end(),cmp);
fin[0].finrank=1;
for(int j=1;j<fin.size();++j){
fin[j].finrank=(fin[j].score==fin[j-1].score)?fin[j-1].finrank:j+1;
}
printf("%d\n",fin.size());
for(int i=0;i<fin.size();++i){
printf("%013lld %d %d %d\n",fin[i].no,fin[i].finrank,fin[i].loca,fin[i].locarank);
}
return 0;
}
1026 Table Tennis
溜了
1027 Colors in Mars
#include <iostream>
using namespace std;
int main(){
char c[14]={"0123456789ABC"};
printf("#");
for(int i=0;i<3;++i){
int num;
cin>>num;
printf("%c%c",c[num/13],c[num%13]);
}
return 0;
}
1028 List Sorting
简单排序题
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
const int maxn=100001;
struct node{
int no,score;
char name[10];
}nodes[maxn];
int c;
bool cmp(node a,node b){
if(c==1) return a.no<b.no;
else if(c==2){
if(strcmp(a.name,b.name)==0) return a.no<b.no;
else strcmp(a.name,b.name)<=0;
}else{
if(a.score==b.score) return a.no<b.no;
else return a.score<=b.score;
}
}
int main(){
int n;
cin>>n>>c;
for(int i=0;i<n;++i){
cin>>nodes[i].no>>nodes[i].name>>nodes[i].score;
}
sort(nodes,nodes+n,cmp);
for(int i=0;i<n;++i){
printf("%06d %s %d\n",nodes[i].no,nodes[i].name,nodes[i].score);
}
return 0;
}
1029 Median
指针解法无敌!
#include <iostream>
using namespace std;
int k[200005];
int main(){
int n,m,temp,count=0;
cin>>n;
for(int i=1;i<=n;++i){
cin>>k[i];
}
k[n+1]=0x7fffffff;
cin>>m;
int midpos=(n+m+1)/2,i=1;
for(int j=1;j<=m;++j){
scanf("%d",&temp);
while(k[i]<temp){
++count;
if(count==midpos) cout<<k[i];
++i;
}
++count;
if(count==midpos) cout<<temp;
}
while(i<=n){
++count;
if(count==midpos) cout<<k[i];
++i;
}
return 0;
}
1030 Travel Plan
Dijkstra的边权以及路径保存
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
int n,m,s,d;
int e[510][510],dis[510],cost[510][510];
vector<int> pre[510];
bool vis[510];
const int inf=1e9;
vector<int> path,temppath;
int mincost=inf;
void dfs(int v){
temppath.push_back(v);
if(v==s){
int tempcost=0;
for(int i=temppath.size()-1;i>0;--i){
int id=temppath[i],nextid=temppath[i-1];
tempcost+=cost[id][nextid];
}
if(tempcost<mincost){
mincost=tempcost;
path=temppath;
}
temppath.pop_back();
return;
}
for(int i=0;i<pre[v].size();++i){
dfs(pre[v][i]);
}
temppath.pop_back();
}
int main(){
fill(e[0],e[0]+510*510,inf);
fill(dis,dis+510,inf);
cin>>n>>m>>s>>d;
for(int i=0;i<m;++i){
int a,b;
cin>>a>>b;
cin>>e[a][b]>>cost[a][b];
e[b][a]=e[a][b];
cost[b][a]=cost[a][b];
}
pre[s].push_back(s);
dis[s]=0;
for(int i=0;i<n;++i){
int u=-1,minn=inf;
for(int j=0;j<n;++j){
if(!vis[j]&&dis[j]<minn){
u=j;
minn=dis[j];
}
}
if(u==-1) break;
vis[u]=1;
for(int v=0;v<n;++v){
if(!vis[v]&&e[u][v]!=inf){
if(dis[v]>dis[u]+e[u][v]){
dis[v]=dis[u]+e[u][v];
pre[v].clear();
pre[v].push_back(u);
}else if(dis[v]==dis[u]+e[u][v]){
pre[v].push_back(u);
}
}
}
}
dfs(d);
for(int i=path.size()-1;i>=0;--i){
printf("%d ",path[i]);
}
printf("%d %d",dis[d],mincost);
return 0;
}
1031 Hello World for U
数学问题
#include <iostream>
#include <cstring>
using namespace std;
int main(){
char c[81],u[30][30];
memset(u,' ',sizeof(u));
scanf("%s",c);
int n=strlen(c)+2;
int n1=n/3,n2=n/3+n%3,index=0;
for(int i=0;i<n1;++i) u[i][0]=c[index++];
for(int i=1;i<=n2-2;++i) u[n1-1][i]=c[index++];
for(int i=n1-1;i>=0;--i) u[i][n2-1]=c[index++];
for(int i=0;i<n1;++i){
for(int j=0;j<n2;++j){
printf("%c",u[i][j]);
}
printf("\n");
}
return 0;
}
1032 Sharing
优秀!
#include <iostream>
using namespace std;
struct node{
char key;
int next;
bool flag;
}nodes[100000];
int main(){
int s1,s2,n,a,b;
cin>>s1>>s2>>n;
char data;
for(int i=0;i<n;++i){
cin>>a>>data>>b;
nodes[a]={data,b,false};
}
for(int i=s1;i!=-1;i=nodes[i].next){
nodes[i].flag=1;
}
for(int i=s2;i!=-1;i=nodes[i].next){
if(nodes[i].flag){
printf("%05d",i);
return 0;
}
}
printf("-1");
return 0;
}
1033 To Fill or Not to Fill
这题也太难了😤
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
const int inf=1e9;
struct station{
double price,dis;
};
bool cmp(station a,station b){
return a.dis<b.dis;
}
int main(){
double cmax,d,davg;
int n;
cin>>cmax>>d>>davg>>n;
vector<station> sta(n+1);
sta[0]={0,d};
for(int i=1;i<=n;++i){
cin>>sta[i].price>>sta[i].dis;
}
sort(sta.begin(),sta.end(),cmp);
double nowdis=0,maxdis=0,nowprice=0,totalprice=0,leftdis=0;
if(sta[0].dis!=0){
printf("The maximum travel distance = 0.00\n");
return 0;
}else{
nowprice=sta[0].price;
}
while(nowdis<d){
maxdis=nowdis+cmax*davg;
double minPriceDis=0,minPrice=inf;
bool flag=0;
for(int i=1;i<=n&&sta[i].dis<=maxdis;++i){
if(sta[i].dis<=nowdis) continue;
if(sta[i].price<nowprice){
totalprice+=(sta[i].dis-nowdis-leftdis)*nowprice/davg;
leftdis=0;
nowprice=sta[i].price;
nowdis=sta[i].dis;
flag=1;
break;
}
if(sta[i].price<minPrice){
minPrice=sta[i].price;
minPriceDis=sta[i].dis;
}
}
if(!flag&&minPrice!=inf){
totalprice+=(nowprice*(cmax-leftdis/davg));
leftdis=cmax*davg-(minPriceDis-nowdis);
nowprice=minPrice;
nowdis=minPriceDis;
}
if(!flag&&minPrice==inf){
nowdis+=cmax*davg;
printf("The maximum travel distance = %.2f\n",nowdis);
return 0;
}
}
printf("%.2f\n",totalprice);
return 0;
}
1034 Head of a Gang
#include <iostream>
#include <map>
using namespace std;
map<string,int> stringToInt;
map<int,string> intToString;
map<string,int> ans;
int idNumber=1,k;
int stoifunc(string s){
if(stringToInt[s]==0){
stringToInt[s]=idNumber;
intToString[idNumber]=s;
return idNumber++;
}else{
return stringToInt[s];
}
}
int g[2010][2010],weight[2010];
bool vis[2010];
void dfs(int u,int&head,int&numMember,int&totalWeight){
vis[u]=1;
++numMember;
if(weight[u]>weight[head]){
head=u;
}
for(int v=1;v<idNumber;++v){
if(g[u][v]>0){
totalWeight+=g[u][v];
g[u][v]=g[v][u]=0;
if(!vis[v]){
dfs(v,head,numMember,totalWeight);
}
}
}
}
void dfsTrave(){
for(int i=1;i<idNumber;++i){
if(!vis[i]){
int head=i,numMember=0,totalWeight=0;
dfs(i,head,numMember,totalWeight);
if(numMember>2&&totalWeight>k){
ans[intToString[head]]=numMember;
}
}
}
}
int main(){
int n,w;
cin>>n>>k;
string s1,s2;
for(int i=0;i<n;++i){
cin>>s1>>s2>>w;
int id1=stoifunc(s1);
int id2=stoifunc(s2);
weight[id1]+=w;
weight[id2]+=w;
g[id1][id2]+=w;
g[id2][id1]+=w;
}
dfsTrave();
cout<<ans.size()<<"\n";
for(auto it=ans.begin();it!=ans.end();++it){
cout<<it->first<<" "<<it->second<<"\n";
}
return 0;
}
1035 Password
名字和要变的密码一块弄进string太秀了
#include <iostream>
#include <vector>
using namespace std;
int main(){
int n;
cin>>n;
vector<string> v;
for(int i=0;i<n;++i){
string name,s;
cin>>name>>s;
int len=s.length(),flag=0;
for(int j=0;j<len;++j){
switch(s[j]){
case '1':s[j]='@';flag=1;break;
case '0':s[j]='\%';flag=1;break;
case 'l':s[j]='L';flag=1;break;
case 'O':s[j]='o';flag=1;break;
}
}
if(flag){
string temp=name+" "+s;
v.push_back(temp);
}
}
int cnt=v.size();
if(cnt!=0){
cout<<cnt<<"\n";
for(int i=0;i<cnt;++i){
cout<<v[i]<<endl;
}
}else if(n==1){
printf("There is 1 account and no account is modified\n");
}else{
printf("There are %d account and no account is modified\n",n);
}
return 0;
}
1036 Boys vs Girls
#include <iostream>
using namespace std;
int main(){
int n;
cin>>n;
string female,male;
int femalescore=-1,malescore=101;
for(int i=0;i<n;++i){
string name,sex,num;
int score;
cin>>name>>sex>>num>>score;
if(sex=="F"){
if(femalescore<score){
femalescore=score;
female=name+" "+num;
}
}else if(malescore>score){
malescore=score;
male=name+" "+num;
}
}
if(femalescore==-1){
printf("Absent\n");
}else cout<<female<<endl;
if(malescore==101){
printf("Absent\n");
}else cout<<male<<endl;
if(femalescore!=-1&&malescore!=101){
printf("%d",femalescore-malescore);
}else printf("NA");
return 0;
}
1037 Magic Coupon
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main(){
int m,n,ans=0,p=0,q=0;
cin>>m;
vector<int> v1(m);
for(int i=0;i<m;++i) cin>>v1[i];
cin>>n;
vector<int> v2(n);
for(int i=0;i<n;++i) cin>>v2[i];
sort(v1.begin(),v1.end());
sort(v2.begin(),v2.end());
while(p<m&&q<n&&v1[p]<0&&v2[q]<0){
ans+=v1[p]*v2[q];
++p;++q;
};
p=m-1,q=n-1;
while(p>=0&&q>=0&&v1[p]>0&&v2[q]>0){
ans+=v1[p]*v2[q];
--p;--q;
}
printf("%d",ans);
return 0;
}
1038 Recover the Smallest Number
string的排序实在太妙了
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
bool cmp(string a,string b){
return a+b<b+a;
}
string str[10010];
int main(){
int n;
cin>>n;
for(int i=0;i<n;++i) cin>>str[i];
sort(str,str+n,cmp);
string s;
for(int i=0;i<n;++i) s+=str[i];
while(s.length()!=0&&s[0]=='0') s.erase(s.begin());
if(s.length()==0) cout<<0;
cout<<s;
return 0;
}
1039 Course List for Student
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int getid(char*name){
int id=0;
for(int i=0;i<3;++i){
id=26*id+name[i]-'A';
}
id=id*10+name[3]-'0';
return id;
}
const int maxn=26*26*26*10+10;
vector<int> v[maxn];
int main(){
int n,k,no,num,id=0;
char name[5];
cin>>n>>k;
for(int i=0;i<k;++i){
cin>>no>>num;
for(int i=0;i<num;++i){
cin>>name;
id=getid(name);
v[id].push_back(no);
}
}
for(int i=0;i<n;++i){
cin>>name;
id=getid(name);
sort(v[id].begin(),v[id].end());
cout<<name<<" "<<v[id].size();
for(int j=0;j<v[id].size();++j){
printf(" %d",v[id][j]);
}
printf("\n");
}
return 0;
}
1040 Longest Symmetric String
再见
1041 Be Unique
#include <iostream>
using namespace std;
int a[100001],m[100000];
int main(){
int n;
cin>>n;
for(int i=0;i<n;++i){
cin>>a[i];
m[a[i]]++;
}
for(int i=0;i<n;++i){
if(m[a[i]]==1){
printf("%d",a[i]);
return 0;
}
}
printf("None");
return 0;
}
1042 Shuffling Machine
#include <iostream>
using namespace std;
int main(){
int cnt;
cin>>cnt;
int start[55],end[55],scan[55];
for(int i=1;i<55;++i){
cin>>scan[i];
end[i]=i;
}
for(int i=0;i<cnt;++i){
for(int j=1;j<55;++j){
start[j]=end[j];
}
for(int k=1;k<55;++k){
end[scan[k]]=start[k];
}
}
char c[6]={"SHCDJ"};
for(int i=1;i<55;++i){
end[i]=end[i]-1;
printf("%c%d",c[end[i]/13],end[i]%13+1);
if(i!=54) printf(" ");
}
return 0;
}
1043 Is It a Binary Search Tree
不愧是柳神,写的代码就是稳
#include <iostream>
#include <vector>
using namespace std;
bool isMirror;
vector<int> pre,post;
void getpost(int root,int tail){
if(root>tail) return;
int i=root+1,j=tail;
if(!isMirror){
while(i<=tail&&pre[root]>pre[i]) ++i;
while(j>root&&pre[root]<=pre[j]) --j;
}else{
while(i<=tail&&pre[root]<=pre[i]) ++i;
while(j>root&&pre[root]>pre[j]) --j;
}
if(i-j!=1) return;
getpost(root+1,j);
getpost(i,tail);
post.push_back(pre[root]);
}
int main(){
int n;
cin>>n;
pre.resize(n);
for(int i=0;i<n;++i) cin>>pre[i];
getpost(0,n-1);
if(post.size()!=n){
isMirror=true;
post.clear();
getpost(0,n-1);
}
if(post.size()==n){
printf("YES\n%d",post[0]);
for(int i=1;i<n;++i) printf(" %d",post[i]);
}else{
printf("NO");
}
return 0;
}
1044 Shopping in Mars
二分查找
#include <iostream>
#include <vector>
using namespace std;
vector<int> sum,resultArr;
int n,m;
void Func(int i,int&j,int&tempsum){
int left=i,right=n;
while(left<right){
int mid=(left+right)/2;
if(sum[mid]-sum[i-1]>=m){
right=mid;
}else left=mid+1;
}
j=right;
tempsum=sum[j]-sum[i-1];
}
int main(){
cin>>n>>m;
sum.resize(n+1);
for(int i=1;i<=n;++i){
cin>>sum[i];
sum[i]+=sum[i-1];
}
int minans=sum[n];
for(int i=1;i<=n;++i){
int j,tempsum;
Func(i,j,tempsum);
if(tempsum>minans) continue;
if(tempsum>=m){
if(tempsum<minans){
resultArr.clear();
minans=tempsum;
}
resultArr.push_back(i);
resultArr.push_back(j);
}
}
for(int i=0;i<resultArr.size();i+=2){
printf("%d-%d\n",resultArr[i],resultArr[i+1]);
}
return 0;
}
1045 Favorite Color Stripe
溜了
1046 Shortest Distance
简单模拟问题,环路长度的最小值
#include <iostream>
#include <vector>
using namespace std;
int main(){
int n;
cin>>n;
vector<int> dis(n+1);
int sum=0,left,right,cnt;
for(int i=1;i<=n;++i){
int temp;
scanf("%d",&temp);
sum+=temp;
dis[i]=sum;
}
cin>>cnt;
for(int i=0;i<cnt;++i){
cin>>left>>right;
if(left>right){
swap(left,right);
}
int temp=dis[right-1]-dis[left-1];
printf("%d\n",min(temp,sum-temp));
}
return 0;
}
1047 Student List for Course
#include <iostream>
#include <vector>
#include <algorithm>
#include <cstring>
using namespace std;
char name[40010][5];
vector<int> course[2510];
bool cmp(int a,int b){
return strcmp(name[a],name[b])<0;
}
int main(){
int n,k;
cin>>n>>k;
for(int i=0;i<n;++i){
int cnt,temp;
cin>>name[i]>>cnt;
for(int j=0;j<cnt;++j){
cin>>temp;
course[temp].push_back(i);
}
}
for(int i=1;i<=k;++i){
printf("%d %d\n",i,course[i].size());
sort(course[i].begin(),course[i].end(),cmp);
for(int j=0;j<course[i].size();++j){
printf("%s\n",name[course[i][j]]);
}
}
return 0;
}
1048 Find Coins
#include <iostream>
using namespace std;
int a[1001];
int main(){
int n,m,temp;
cin>>n>>m;
for(int i=0;i<n;++i){
cin>>temp;
a[temp]++;
}
for(int i=0;i<1001;++i){
if(a[i]){
a[i]--;
if(m>i&&a[m-i]){
printf("%d %d",i,m-i);
return 0;
}
a[i]++;
}
}
printf("No Solution");
return 0;
}
1049 Counting Ones
数学问题
#include <iostream>
using namespace std;
int main(){
int n,left=0,right=0,a=1,now=1,ans=0;
cin>>n;
while(n/a){
left=n/(a*10),now=n/a%10,right=n%a;
if(now==0) ans+=left*a;
else if(now==1) ans+=left*a+right+1;
else ans+=(left+1)*a;
a*=10;
}
printf("%d",ans);
return 0;
}
1050 String Subtraction
转换为hash问题
#include <iostream>
#include <string>
#include <cstring>
using namespace std;
char s1[100000],s2[100000];
int main(){
cin.getline(s1,100000);
cin.getline(s2,100000);
int len1=strlen(s1),len2=strlen(s2);
bool flag[256]={0};
for(int i=0;i<len2;++i){
flag[s2[i]]=1;
}
for(int i=0;i<len1;++i){
if(!flag[s1[i]]){
printf("%c",s1[i]);
}
}
return 0;
}