【算法】PTA刷题记录

1004 成绩排名

 题目很简单,但太久没敲过代码甚至不记得sort函数怎么用。

把姓名,学号,成绩存进结构体里。写一个cmp,就可以对结构体数组按照成绩进行排序。

#include
using namespace std;
const int N=1e5+10;
struct stud
{
	string name,num;
	int score;
}stu[N];
bool cmp(stud a,stud b)
{
	return a.scoresigned main()
{
	int n;
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		cin>>stu[i].name>>stu[i].num>>stu[i].score; 
	}
	sort(stu+1,stu+n+1,cmp);
	
	cout<" "<1].name<<" "<1].num;
	
	return 0;
}

1005 继续(3n+1)猜想

这题重点在于理解题目意思,“现在给定一系列待验证的数字,我们只需要验证其中的几个关键数,就可以不必再重复验证余下的数字”。

我开始理解的是要求每个数求解过程中出现的在a数组中的数,后来才发现,题目是要剔除那些在求解一个数过程中出现的数。

比如:

int:6
out:3 5 6 7 8 11

3-》5-》8-》4-》2-》1                                                 因此,5 8被剔除

6-》3-》5-》8-》4-》2-》1                                          因此,3也被剔除

7-》11-》17-》26-》13-》20-》10-》58-》4-》2-》1 因此,11也被剔除

因而题目只剩下6,7。

#include
using namespace std;
const int N=110;
set<int> st;
int ans[N],a[N];
signed main()
{
    int n;
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        cin>>a[i];
        if(st.find(a[i])==st.end()) st.insert(a[i]);
    }
    for(int i=1;i<=n;i++)
    {
        int x=a[i];
        while(x!=1)
        {
            if(x%2)	x=(3*x+1)/2;
			else	x/=2;
			
            if(st.find(x)!=st.end()) st.erase(x);//删除过程中出现的数 
        }
    }
    int j=0;
    for(auto i:st)	ans[++j]=i;
	for(int i=j;i>=1;i--)
	{
		cout<if(i!=1) cout<<" ";
	}
    
    return 0;
}

1006 换个格式输出整数

这题比较简单。只要注意存的字符串方向就行。 

#include
using namespace std;
const int N=110;

signed main()
{
    string x;
    cin>>x;
    int n=x.length();
    for(int i=0;i<=n-1;i++)
    {
    	int p=x[i]-'0';
    	for(int j=1;j<=p;j++)
    	{
    		if((n-i)==3) cout<<"B";
    		else if((n-i)==2) cout<<"S";
			else cout<

 1007 素数对猜想

#include
using namespace std;
const int N=1e5+10;
int cnt;
int a[N];
bool isprime(int x)
{
	if(x==1) return false;
	for(int i=2;i<=x/i;i++)
	{
		if(x%i==0) return false;
	}
	return true;
}
signed main()
{
	int n,k=0;
	cin>>n;    
    for(int i=2;i<=n-2;i++)
    {
    	if(isprime(i)&&isprime(i+2))
    	{
    		cnt++;
		}
	}
	cout<

 1008 数组元素循环右移问题

顺还队列的思想。

#include
using namespace std;
const int N=1e5+10;
int a[N],b[N];
signed main()
{
	int n,m;
	cin>>n>>m;
	for(int i=0;i>a[i];
	}
	for(int i=0;i

 1009 说反话

#include
using namespace std;
const int N=1e5+10;
char g[85][20];
signed main()
{
	int i=1;
	while((scanf("%s",g[i++]))!=EOF){
		getchar();
	}
	for(int j=i-2;j>=1;j--)
	{
		cout<

1010 一元多项式求导

#include
using namespace std;
signed main()
{
    int x,n;
    scanf("%d %d",&x,&n);
    if(n==0)printf("%d %d",0,0);
    else  printf("%d %d",x*n,n-1);
    while(scanf("%d %d",&x,&n)!=EOF)
    {
        if(n!=0)printf(" %d %d",n*x,n-1);
    }
    return 0;
}

 

你可能感兴趣的:(pta刷题,算法,c++,数据结构)