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 113-》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;
}