PAT1056 Mice and Rice
细心再细心,理解题意,模拟。
#include<iostream>
#include<vector>
#include<algorithm>
#define ac cin.tie(0);cin.sync_with_stdio(0);
using namespace std;
const int MAXN = 1010;
int arr[MAXN], ans[MAXN], cnt[MAXN];
int n, m;
int main() {
ac
cin >> n >> m;
for (int i = 0; i < n; i++)
cin >> arr[i];
int t, rd = 1;
vector<int> a;
for (int i = 0; i < n; i++) {
cin >> t;
a.push_back(t);
}
//不止一个胜者就继续
while (a.size() > 1) {
vector<int> b;
int pos = 0, tmp = 0;
while (pos < a.size()) {
if (pos % m == 0) {
if (pos)
//将胜者放入下一轮
b.push_back(a[tmp]);
tmp = pos;
} else {
if (arr[a[pos]] > arr[a[tmp]]) {
ans[a[tmp]] = rd;
tmp = pos;
} else
ans[a[pos]] = rd;
}
++pos;
}
b.push_back(a[tmp]);
//计算本轮淘汰的人
cnt[rd] = a.size() - (a.size() / m + (a.size() % m != 0));
++rd;
a.clear();
for (int i:b)
a.push_back(i);
}
cnt[rd] = 1;
ans[a[0]] = rd;
//累加人数,便于求名次
for (int i = rd; i >= 1; i--)
cnt[i] += cnt[i + 1];
for (int i = 0; i < n; i++) {
if (i)
cout << " ";
cout << cnt[ans[i] + 1] + 1;
}
}
PAT1040 Longest Symmetric String
最长回文子串,算法模板题。
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
const int MAXN = 1010;
bool dp[MAXN][MAXN];
string s;
int ans = 1;
int main() {
int ri;
getline(cin, s);
for (int i = 0; i < s.length(); i++) {
dp[i][i] = true;
if (i) {
if (s[i - 1] == s[i]) {
dp[i - 1][i] = true;
ans = 2;
}
}
}
//由短区间推长区间,长区间计算得依赖的短区间已经计算过了
for (int len = 2; len < s.length(); len++) {
for (int le = 0; le + len < s.length(); le++) {
ri = le + len;
dp[le][ri] = ((s[le] == s[ri]) && dp[le + 1][ri - 1]);
if (dp[le][ri])
ans = max(ans, ri - le + 1);
}
}
cout << ans;
return 0;
}
PAT1044 Shopping in Mars
双指针裸题
#include<iostream>
#include<vector>
#define ac cin.tie(0);cin.sync_with_stdio(0);
using namespace std;
const int MAXN=100010;
int arr[MAXN];
int n,m;
typedef pair<int,int> PAIR;
vector<PAIR> ans;
int main(){
ac
cin>>n>>m;
for(int i=1;i<=n;i++)
cin>>arr[i];
int cost=1e8+10,tmp=arr[1],le=1,ri=1;
while(true){
if(tmp<m){
//移动右指针
++ri;
if(ri>n)
break;
tmp+=arr[ri];
}else{
if(tmp-m<cost){
cost=tmp-m;
ans.clear();
ans.push_back(PAIR(le,ri));
}else if(tmp-m==cost){
ans.push_back(PAIR(le,ri));
}
//移动左指针
tmp-=arr[le];
++le;
}
}
for(PAIR &i:ans)
cout<<i.first<<"-"<<i.second<<endl;
return 0;
}
PAT1153 Decode Registration Card of PAT
本题最大收获:大量输入输出情况下不用cin,把scanf 改为 cin 就AC了,否则最后一个样例TLE ><
#include<iostream>
#include<string>
#include<vector>
#include<unordered_map>
#include<algorithm>
using namespace std;
const int MAXN=10010;
struct node{
string name;
int score;
bool operator<(const node& a){
if(score!=a.score)
return score>a.score;
else
return name<a.name;
}
}arr[MAXN];
int main(){
int n,m,a;
string s;
cin>>n>>m;
for(int i=0;i<n;i++){
cin>>arr[i].name>>arr[i].score;
}
for(int i=1;i<=m;i++){
cin>>a>>s;
printf("Case %d: %d %s\n",i,a,s.c_str());
if(a==1){
vector<node> ans;
for(int j=0;j<n;j++)
if(arr[j].name[0]==s[0])
ans.push_back(arr[j]);
if(ans.size()){
sort(ans.begin(),ans.end());
for(const node& i:ans)
printf("%s %d\n",i.name.c_str(),i.score);
}else
puts("NA");
}else if(a==2){
int cnt=0,ans=0;
for(int j=0;j<n;j++)
if(arr[j].name.substr(1,3)==s){
++cnt;
ans+=arr[j].score;
}
if(cnt)
printf("%d %d\n",cnt,ans);
else
puts("NA");
}else{
unordered_map<string,int> map;
for(int j=0;j<n;j++)
if(arr[j].name.substr(4,6)==s)
map[arr[j].name.substr(1,3)]++;
if(!map.empty()){
vector<pair<int, string>> tmp;
for(auto i:map)
tmp.push_back({-i.second,i.first});
sort(tmp.begin(),tmp.end());
for(auto a:tmp)
printf("%s %d\n",a.second.c_str(),-a.first);
}else
puts("NA");
}
}
return 0;
}