【算法】PTA刷题记录

1004 成绩排名

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

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

#include<bits/stdc++.h>
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.score<b.score;
}
signed 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<<stu[n].name<<" "<<stu[n].num<<endl;
	cout<<stu[1].name<<" "<<stu[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<bits/stdc++.h>
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<<ans[i];
		if(i!=1) cout<<" ";
	}
    
    return 0;
}

1006 换个格式输出整数

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

#include<bits/stdc++.h>
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<<j;
		}
	}
    
    return 0;
}

 1007 素数对猜想

#include<bits/stdc++.h>
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<<cnt;
    return 0;
}

 1008 数组元素循环右移问题

顺还队列的思想。

#include<bits/stdc++.h>
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<n;i++)
	{
		cin>>a[i];
	}
	for(int i=0;i<n;i++)
	{
		b[(i+m)%n]=a[i]; 
	}
	for(int i=0;i<n;i++)
	{
		cout<<b[i];
		if(i!=n-1) cout<<" ";
	}
    return 0;
}

 1009 说反话

#include<bits/stdc++.h>
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<<g[j];
		if(j!=1) cout<<" ";
	}
    return 0;
}

1010 一元多项式求导

#include<bits/stdc++.h>
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;
}

1011 A+B 和 C

题目很简单,复习一下进制。

 2的31次方:2147483648。也就是1e9-1e10

int 范围是

-2147483648~2147483647 也就是2的31次方

long long的最大值:9223372036854775807

所以开longlong不会爆

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;

bool solve()
{
	long long a,b,c;
	cin>>a>>b>>c;
	if(a+b>c) return true;
	else return false;
}
signed main()
{
	int t;
	cin>>t;
	for(int i=1;i<=t;i++)
	{
		if(solve()) cout<<"Case #"<<i<<": true"<<"\n";
		else cout<<"Case #"<<i<<": false"<<"\n"; 
	}
	
    return 0;
}

 1012 数字分类

 没有思路可言,纯模拟题。

#include<iostream>

using namespace std;

int main() {
	//ios::sync_with_stdio(false);
	int n, num;
	int ans[6] = { 0 };
	double A4 = 0.0;
	cin >> n;
	int t = 1;
	bool flag[6] = { false };//判断每个类型的数是否有出现

	for (int i = 0; i < n; i++) {
		cin >> num;
		if (num % 10 == 0 ) {
			ans[1] += num;
			flag[1] = true;
		}
		else if (num % 5 == 1) {
			ans[2] = ans[2] + num * t;
			t = -t;
			flag[2] = true;
		}
		else if (num % 5 == 2) {
			ans[3]++;
			flag[3] = true;
		}
		else if (num % 5 == 3) {
			ans[4]++;//统计被5除后余3的数字的个数
			A4 += num;
			flag[4] = true;
		}
		else if (num % 5 == 4) {
			if (ans[5] < num) ans[5] = num;
			flag[5] = true;
		}
	}

	for (int i = 1; i < 6; i++) {
		if (i != 1) cout << " ";
		if (!flag[i]) {
			cout << "N";
		}
		else if (i == 4) {
			printf("%.1f", A4 / ans[4]);
		}
		else {
			cout << ans[i];
		}
	}

	return 0;
}

1013 数素数 

第四个测试点过不了,查到了原因

把范围改到104730以内(因为第10000个素数等于104729),这个数既不爆也包含了第10000个素数 

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int a[N];
bool isprime(int x)
{
	for(int i=2;i<=x/i;i++)
	{
		if(x%i==0) return false;
	}
	return true;
}
signed main()
{
	int cnt=0,j=0;
	int n,m;
	cin>>n>>m;
	for(int i=1;i<=104730;i++)
	{
		if(isprime(i)) a[j++]=i;
	}
	for(int i=n;i<=m;i++)
	{
			cout<<a[i];
			++cnt;
			if(cnt%10==0) cout<<"\n";
			else if(cnt%10&&i!=m) cout<<" ";
	}
    return 0;
}

 1014 福尔摩斯的约会

#include<iostream>
#include<string>
using namespace std;
int main()
{
	int flag = 0;
	string s1, s2, s3, s4;
	cin >> s1 >> s2 >> s3 >> s4;
	string weight[7] = { "MON","TUE","WED","THU","FRI","SAT","SUN" };
	for (int i = 0; i < s1.size()&&i<s2.size(); i++)
	{
		if (flag)
		{
			if (s1[i]<='9'&&s1[i]>='0' && s1[i] == s2[i])
			{
				printf("%02d:", (s1[i] - '0'));
				break;
			}
			else if (s1[i] >= 'A'&&s1[i] <= 'N'&&s1[i] == s2[i])
			{
				printf("%02d:", (s1[i] - 'A' + 10));
				break;
			}
		}
		else if (s1[i] >= 'A'&&s1[i] <= 'G'&&s1[i] && s1[i] == s2[i])
		{
			flag = 1;
			cout << weight[s1[i] - 'A'] << " ";
		}
	}
	for (int i = 0; i < s3.size()&&i<s4.size(); i++)
	{
		if(isalpha(s3[i])&&s3[i]==s4[i])
		{
			printf("%02d",i);
		}
	}
	return 0;
}

1015 德才论 

模拟题是真恶心啊,

“,每行按照输入格式输出一位考生的信息,考生按输入中说明的规则从高到低排序。当某类考生中有多人总分相同时,按其德分降序排列;若德分也并列,则按准考证号的升序输出。”看漏了就只有4分,

另外这题卡cin,cout,因为数据量比较大。加了下面的才能过。

std::ios::sync_with_stdio(false);
std::cin.tie(nullptr);

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
struct stu{
	string num;
	int de,cai;
	int sum;
}a[N],b[N];
map<string,int> mp;
bool cmp2(stu st1,stu st2)
{
	if(st1.sum!=st2.sum) return st1.sum>st2.sum;
	else if(st1.de!=st2.de) return st1.de>st2.de;
	else return st1.num<st2.num;
}
signed main()
{
    std::ios::sync_with_stdio(false);
    std::cin.tie(nullptr);
	int n,l,h;
	cin>>n>>l>>h;
	int p=0;
	for(int i=1;i<=n;i++) 
	{
		cin>>a[i].num>>a[i].de>>a[i].cai;
		a[i].sum=a[i].cai+a[i].de;
		if(a[i].de>=h&&a[i].cai>=h)//德才均不低于优先录取线 
		{
			b[++p]=a[i];
			mp[a[i].num]=1;
		}
	}
	sort(b+1,b+p+1,cmp2);
	/*for(int i=1;i<=p;i++)
	{
		cout<<b[i].de<<endl;
	}*/
	int q=p;
	for(int i=1;i<=n;i++) 
	{
		if(a[i].de<l||a[i].cai<l) continue; 
		if(a[i].de>=h&&a[i].cai<h&&!mp[a[i].num])//才分不到但德分到优先录取线
		{
			b[++q]=a[i];
			mp[a[i].num]=1;
		}
	}
	sort(b+p+1,b+q+1,cmp2);
	
	int j=q;
	for(int i=1;i<=n;i++) 
	{
		if(a[i].de<l||a[i].cai<l) continue; 
		if(a[i].de<h&&a[i].cai<h&&a[i].de>=a[i].cai&&!mp[a[i].num])
		{
			b[++j]=a[i]; //德才分均低于 H,但是德分不低于才分的考生
			mp[a[i].num]=1;
		}
	}
	sort(b+q+1,b+j+1,cmp2);
	int t=j;
	for(int i=1;i<=n;i++)
	{//其他达到最低线 L 的考生也按总分排序,但排在第三类考生之后。
		if(a[i].de<l||a[i].cai<l) continue; 
		if(!mp[a[i].num])
		{
			b[++t]=a[i];
		}
	}
	sort(b+j+1,b+t+1,cmp2);
	
	cout<<t<<endl;
	for(int i=1;i<=t;i++)
	{
		cout<<b[i].num<<" "<<b[i].de<<" "<<b[i].cai<<endl;
	}
    return 0;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值