测试样例3结果为零;不要忘记考虑零的结果
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
string change[] = {"zero","one","two","three","four","five","six","seven","eight","nine"};
int main()
{
string s;
long long n = 0;
vector<int> ans;
cin >> s;
int len = s.size();
for(int i = 0; i < len; i++){
n += (s[i]-'0');
}
if(n==0){//一定要考虑0!!!
cout << "zero";
return 0;
}
while(n){
ans.push_back(n%10);
n/=10;
}
for(int i = ans.size()-1; i >= 0; i--){
cout << change[ans[i]];
if(i) printf(" ");
}
return 0;
}
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n,a,tmp=0,sum=0;
cin >> n;
for(int i = 0; i < n; i++){
cin >> a;
if(tmp-a<0){//上升
sum += (a-tmp)*6+5;
}
else {
sum += (tmp-a)*4+5;
}
tmp = a;
}
cout << sum;
return 0;
}
3.PAT1011
这里值得注意的是:用double型表示数据,然后输出用llf出错;改成float,输出用f好了
或者用C++输出方案:
cout << setiosflags(ios::fixed) << setprecision(2) << (maxn*0.65-1)*2;
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
int main()
{
float a,b,c;
float maxn = 1;
char ch[3];
for(int i = 0; i < 3; i++){
cin >>a>>b>>c;
if(a>b&&a>c){
maxn *= a;
ch[i] = 'W';
}
else if(b>a&&b>c){
maxn *= b;
ch[i] = 'T';
}
else if(c>a&&c>b){
maxn *= c;
ch[i] = 'L';
}
}
for(int i = 0; i < 3; i++){
cout << ch[i] << " ";
}
printf("%.2f",(maxn*0.65-1)*2);
return 0;
}
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
vector<int> ans;
void fun(int n,int b)
{
ans.clear();
while(n){
ans.push_back(n%b);
n /= b;
}
}
bool judge()
{
int len = ans.size();
for(int i = 0; i < len/2; i++){
if(ans[i]!=ans[len-i-1]){
return false;
}
}
return true;
}
int main()
{
int n,b;
cin >>n>>b;
//n>0 因此无需特判0
fun(n,b);
if(judge()) printf("Yes\n");
else printf("No\n");
for(int i = ans.size()-1; i >= 0; i--){
cout << ans[i];
if(i) printf(" ");
}
return 0;
}
5.PAT1023
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
int a[25];
int b[25];
bool vis_b[25];
bool judge(int len)
{
for(int i = 0; i < len; i++){
bool flag = false;//第一次flag逻辑写错
for(int j = 0; j < len; j++){
if(b[j]==a[i]&&!vis_b[j]){
vis_b[j] = true;
flag = true;
break;
}
}
if(!flag) return false;
}
return true;
}
int main()
{
string s;
cin >> s;
for(int i = 0; i < s.size(); i++){
a[i] = s[i]-'0';
}
int len = s.size();
int c = 0;
for(int i = len-1; i >= 0; i--){
int tmp = a[i]*2+c;
b[len-i-1] = tmp%10;
c = tmp/10;
}
if(c>0){
printf("No\n");
len++;
b[len-1] = c;
}
else {
memset(vis_b,false,sizeof(vis_b));
if(judge(len)) printf("Yes\n");
else printf("No\n");
}
for(int i = len-1; i >= 0; i--){
printf("%d",b[i]);
}
return 0;
}
6.PAT1027
注意考虑0;考虑只有一位数字时怎么输出:<=9输出"0%d"或“0%c”,要考虑是数字还是字母输出,一定要考虑全面。
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
vector<int> a;
void fun(int n)
{
a.clear();
if(n==0){
printf("00");
return;
}
while(n){
a.push_back(n%13);
n /= 13;
}
if(a.size()==1){
printf("0");
if(a[0]>9) printf("%c",'A'+(a[0]-9)-1);
else printf("%d",a[0]);
}
else {
for(int i = 1; i>=0; i--){
if(a[i]>9) printf("%c",'A'+(a[i]-9)-1);
else printf("%d",a[i]);
}
}
}
int main()
{
int r,g,b;
cin >>r>>g>>b;
cout << "#";
fun(r);
fun(g);
fun(b);
return 0;
}
7.PAT1035
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
struct password
{
string id,pwd;
bool flag;
password(){}
password(string id,string pwd,bool flag):id(id),pwd(pwd),flag(flag){}
};
vector<password> v;
bool _replace(password &p)
{
// string s = p.pwd;//这样写无法改变pwd值
int cnt = 0;
for(int i = 0; i < p.pwd.size(); i++){
if(p.pwd[i]=='1') p.pwd[i] = '@';
else if(p.pwd[i]=='0') p.pwd[i] = '%';
else if(p.pwd[i]=='l') p.pwd[i] = 'L';
else if(p.pwd[i]=='O') p.pwd[i] = 'o';
else cnt++;
}
if(cnt==p.pwd.size()) return false;
p.flag = true;
return true;
}
int main()
{
int n,cnt=0;
string id,pwd;
cin >> n;
for(int i = 0; i < n; i++){
cin >>id>>pwd;
password p = password(id,pwd,false);
if(_replace(p)) cnt++;
v.push_back(p);//push操作要在replace以后
}
if(cnt>0){
cout << cnt << endl;
for(int i = 0; i < v.size(); i++){
if(v[i].flag){
cout << v[i].id << " " << v[i].pwd << endl;
}
}
}
else {
if(n==1){
printf("There is 1 account and no account is modified");
}
else {
printf("There are %d accounts and no account is modified",n);
}
}
return 0;
}
8.PAT1041
思路很简单一道题,差点写得复杂;
所以说做题一定先明确思路,是不是最简单的或你在有限时间内能够想出的最简单的方法,否则过分复杂的思路是浪费时间。
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
const int N = 1e5+5;
int a[N];
int visTimes[N];
int main()
{
int n;
cin >> n;
for(int i = 0; i < n; i++){
cin >> a[i];
visTimes[a[i]]++;
}
bool FIND = false;
for(int i = 0; i < n; i++){
if(visTimes[a[i]]==1){
printf("%d",a[i]);
FIND = true;
break;
}
}
if(!FIND) printf("None");
return 0;
}
第一次提交:最后一个样例超时
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
const int N = 1e5+5;
int d[N];
int calculate(int a,int b)
{
int ans=0;
int minn = min(a,b),maxn = max(a,b);
for(int i = minn; i <= maxn-1; i++){
ans += d[i];
}
return ans;
}
int main()
{
int n,m,a,b,sum = 0;
cin >> n;
for(int i = 1; i <= n; i++){
cin >> d[i];
sum += d[i];
}
cin >> m;
for(int i = 0; i < m; i++){
cin >>a>>b;
int ans = calculate(a,b);
cout << min(ans,sum-ans) << endl;
}
return 0;
}
修改后:
增加了一个类似前缀和的dis数组,dis[i]表示1~i之间的距离,则表示a~b之间距离可用dis[b-1]~dis[a-1]来计算;此题时间限制为200ms,用此法最后一个样例为77ms
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
const int N = 1e5+5;
int d[N];
int dis[N];
int main()
{
int n,m,a,b,sum = 0;
cin >> n;
dis[0] = 0;
for(int i = 1; i <= n; i++){
cin >> d[i];
dis[i] = dis[i-1]+d[i];
sum += d[i];
}
cin >> m;
for(int i = 0; i < m; i++){
cin >>a>>b;
int tmp;
if(a<b) tmp = dis[b-1] - dis[a-1];
else tmp = dis[a-1] - dis[b-1];
cout << min(tmp,sum-tmp) << endl;
}
return 0;
}