目录
2013
1000 回文字符串
题目描述
代码
#include<iostream>
using namespace std;
#include<string>
//判断是否为回文字符串:从串头和串尾比对,当出现不匹配时返回no
string isRight(string s){
int length=s.size();
int start=0,end=length-1;
while(start<end&&s[start]==s[end]){
start++;
end--;
}
if(start<end){
return "no";
}
return "yes";
}
int main(){
string s;
int count=0;
while(cin>>s){
//注意输出格式
count++;
cout<<"case";
cout<<count;
cout<<": "+isRight(s)<<endl;
}
}
1001 水仙数
题目描述
代码
#include<iostream>
using namespace std;
#include<string>
#include<math.h>
bool isRight(int num){
int sum=0;
while(num>0){
sum+=pow(num%10,3);
num/=10;
}
if(sum==num)
return true;
return false;
}
int main(){
int start=370,end=371;
while(cin>>start>>end){
bool flag=false;//用来判断本次是否已经输出过水仙数
for(int i=start;i<=end;i++){
if(flag)
cout<<' ';
if(isRight(i)){
cout<<i;
flag=true;
}
}
if(!flag){
cout<<"no";
}
cout<<endl;
}
}
问题
试了几次没有ac,后来解决了,提供一些思路给没有ac的人。
1、使用输出空格,不要用ends,直接使用字符串
2、每行末不要多输出空格
3、最后一行多输出一个换行没有关系,是可以ac的
1002 安全密码
题目描述
代码
#include<iostream>
using namespace std;
#include<string>
#include<math.h>
bool isRight(string s){
int length=s.size();
if(length<8)
return false;
int count1=0,count2=0,count3=0,count4=0;
for(int i=0;i<length;i++){
if(s[i]>='a'&&s[i]<='z'){
count1=1;
}else if(s[i]>='A'&&s[i]<='Z'){
count2=1;
}else if(s[i]>='0'&&s[i]<='9'){
count3=1;
}else if(s[i]=='~'||s[i]=='!'||s[i]=='@'||s[i]=='#'||s[i]=='$'||s[i]=='%'||s[i]=='^'){
count4=1;
}
}
if(count1+count2+count3+count4>2)
return true;
return false;
}
int main(){
string s;
while(cin>>s){
if(isRight(s)){
cout<<"YES"<<endl;
}else{
cout<<"NO"<<endl;
}
}
}
1003 最少钱币数
题目描述
代码
#include<iostream>
using namespace std;
#include<string>
#include<math.h>
int isRight(int num){
int count=0;
if(num>=100){
count+=(num/100);
num%=100;
}
if(num>=50){
count+=(num/50);
num%=50;
}
if(num>=10){
count+=(num/10);
num%=10;
}
if(num>=5){
count+=(num/5);
num%=5;
}
if(num>=2){
count+=(num/2);
num%=2;
}
if(num>=1){
count+=(num/1);
num%=1;
}
if(num>0)
return -1;
return count;
}
int main(){
int num;
while(cin>>num){
int count=0;
for(int i=0;i<num;i++){
int tmp,re;
cin>>tmp;
if(count<0)
continue;
re=isRight(tmp);
if(re<0){
cout<<"Impossible"<<endl;
count=-1;
continue;
}
count+=re;
}
if(count>=0)
cout<<count<<endl;
}
}
1004 惠民工程
题目描述
代码
#include<iostream>
using namespace std;
#include<string>
#include<math.h>
#include<vector>
#include<algorithm>
typedef struct Node{
int x;
int y;
int value;
}Node;
int findParent(vector<int> parent,int x){
int re=x;
while(parent[re]>=0){
re=parent[re];
}
return re;
}
int solution(vector<Node> p,int m){
sort(p.begin(),p.end(),[](Node a,Node b){
return a.value<b.value;
});
int length=p.size();
vector<int> parent(m,-1);
int count=0;
int value=0;
for(int i=0;i<length;i++){
int x=p[i].x-1;
int y=p[i].y-1;
int px=findParent(parent,x);
int py=findParent(parent,y);
if(px==py){
continue;
}
if(px==x){
parent[px]=y;
}else if(py==y){
parent[py]=x;
}else{
parent[py]=px;
}
count++;
value+=p[i].value;
if(count==m-1)
break;
}
if(count==m-1)
return value;
return -1;
}
int main(){
int m,n;
while(cin>>m>>n){
vector<Node> p;
int i,j,value;
while(n>0){
Node temp;
cin>>temp.x>>temp.y>>temp.value;
p.push_back(temp);
n--;
}
int re=solution(p,m);
if(re<0)
cout<<"?"<<endl;
else
cout<<re<<endl;
}
}
问题
这里是很明显的最小生成树,可以采用Prim或者Kruskal算法,我之前用的是Prim算法,但是有50%的测试数据不通过,换成Kruskal算法才AC。