ACM赛制,对于大佬来说很简单 但是对于我这种二愣子。。。(QAQ)
第一题 P6363 [传智杯 #2 初赛] 软件工程实习
这题题目信息非常多,按照步骤一步一步走,就挺简单了不知道洛谷的通过率为啥这么低 QAQ
#include<iostream>
#include<algorithm>
#include<cstring>
#include<unordered_map> //存取每一个队伍的成绩,用哈希表比较简单
#include<cmath> //floor() ceil() round()
using namespace std;
int n,k;
struct stu{ //学生信息比较多,再加上有operator重载 比较简洁 因此用结构体存比较好
char b;
double sum;
bool operator<(const stu&M)const {
if(sum==M.sum)
{
return b<M.b;
}
else return sum>M.sum;
}
}s[1010];
//哈希表存储每个队伍的分数
unordered_map<char,int>mp;
int duiwu[30][30];
int main()
{
cin>>n>>k;
for(int i=0;i<n;i++)
{
int a;
char b;
cin>>a>>b;
s[i].b=b;
s[i].sum=a;
}
//队伍的评分,采用纵向遍历
for(int i=0;i<k;i++)
{
for(int j=0;j<k;j++)
{
cin>>duiwu[i][j];
}
}
for(int i=0;i<k;i++) //对于每个队伍都去求其总分
{
double sum=0;
double ave=0;
int x=k;
for(int j=0;j<k;j++)
{
sum+=duiwu[j][i];
}
ave=sum/k;
for(int j=0;j<k;j++)
{
if(abs(ave-duiwu[j][i])>15)
{
x--;
sum-=duiwu[j][i];
}
}
ave=sum/x;
ave=round(ave);
char ch=(i+'A');
mp[ch]=ave;
}
//再次遍历每个学生确认最终成绩
for(int i=0;i<n;i++)
{
s[i].sum=round(0.4*mp[s[i].b]+0.6*s[i].sum);
}
sort(s,s+n);
for(int i=0;i<n;i++)
{
printf("%.0lf %c\n",s[i].sum,s[i].b);
}
return 0;
}
第二题 P6364 [传智杯 #2 初赛] 1024 程序员节发橙子
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cstdio>
using namespace std;
const int N = 1e6+10;
int s[N],t[N];//t存的是s对应的橙子个数,最后把t数组遍历一遍累加
long long res=0;
int main()
{
int n;
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>s[i];
}
for(int i=1;i<=n;i++) t[i]=1;
//正着求一遍s,其实就是求上升子序列,如果下一个小于等于前一个
//不管它,反之前一个的数量加1
for(int i=2;i<=n;i++)
{
if(s[i]>s[i-1]) t[i]=t[i-1]+1;
else if(t[i]==t[i-1]) t[i]=t[i-1];
}
//反着来一遍类似于第一遍的方式
for(int i=n;i>=2;i--)
{//第二遍对于第一遍需要求个最大值
if(s[i]<s[i-1]) t[i-1]=max(t[i-1],t[i]+1);
else if(s[i]==s[i-1]) t[i-1]=t[i];
}
//累加起来
for(int i=1;i<=n;i++) res+=t[i];
cout<<res<<endl;
return 0;
}
第三题 P6365 [传智杯 #2 初赛] 众数出现的次数
这个题我以为要用二进制枚举呢,后来考虑可以把每个学生的两种可能加进去,因为要求的是众数所以,在这些数中;
相对的增加某个数的个数,对于最终结果没啥影响(WO TM 还傻了吧鸡去枚举 《QAQ》)
#include<bits/stdc++.h>
using namespace std;
const int N = 1e6+10;
typedef pair<int,int> PII;
vector<PII>s;
long long xx=-1,ress=-1;
int main()
{
int n;
cin>>n;
for(int i=0;i<n;i++)
{
int a,b;
cin>>a>>b; //a时红卡,b是黑卡
s.push_back({a,b});
}
//采用二进制枚举的方式枚举所有可能
for(int i=0;i< 1<<n;i++)
{
map<long long,long long>hash;
for(int j=0;j<n;j++)
{
if(i>>j&1)
{
hash[s[j].first]++;
}
else hash[s[j].first^s[j].second]++;
}
long long res=-1;
long long num=-1;
for(auto i:hash)
{
if(i.second>res)
{
res=i.second;
num=i.first;
}
}
if(res>ress)
{
ress=res;
xx=num;
}
}
cout<<xx<<endl;
return 0;
}
第四题 P6366 [传智杯 #2 初赛] 特殊的翻转
这题就差两个样例,有大佬帮我看看吗 救救我吧
#include<bits/stdc++.h>
using namespace std;
const int N = 1e6+10;
string s,p;
map<char,int>h;
int res=1e8;
int main()
{
h['A']=10,h['B']=11,h['C']=12,h['D']=13,h['E']=14,h['F']=15;
cin>>s;
for(int i=0;i<s.size();i++)
{
char ss[5];
int k=0;
int num=0;
if(s[i]>='0'&&s[i]<='9') num=s[i]-'0';
else num=h[s[i]];
//将数字转化为对应二进制
do{
ss[k++]=num%2+'0';
num/=2;
}while(num);
while(k<=3) ss[k++]='0';
//把它加到p串中
for(int i=k-1;i>=0;i--) p+=ss[i];
}
int st=0,ed=p.size()-1;
while(p[st]=='0'&&p.size()>1) st++;
// for(int i=st;i<=ed;i++) cout<<p[i];
//从st开始 ed结束 p为待求字串 转化成功
int k=0;
int m[N],n[N],q[N];
for(int i=st;i<=ed;i++)
{
m[i-st]=p[i];
n[i-st]=p[i];
q[i-st]=p[i];
k++;
}
//从零开始 长度为k-1
//第一种情况
if(p[st]=='1')
{
int res1=1;
int res2=0;
//翻转前两个字符
n[0]='0';
n[1]=(n[1]=='1')?'0':'1';
for(int i=1;i<=k-3;i++)
{
if(n[i]=='1'){
res1++;
n[i]='0';
n[i+1]=(n[i+1]=='1')?'0':'1';
n[i+2]=(n[i+2]=='1')?'0':'1';
}
}
if(n[k-1]==n[k-2]) {
if(n[k-1]=='1')
{
res1++;
}
}
else res1=-1;
if(res1<res&&res1!=-1) res=res1;
//-----------------------
for(int i=0;i<=k-3;i++)
{
if(m[i]=='1'){
res2++;
m[i]='0';
m[i+1]=(m[i+1]=='1')?'0':'1';
m[i+2]=(m[i+2]=='1')?'0':'1';
}
}
if(m[k-1]==m[k-2]) {
if(m[k-1]=='1')
{
res2++;
}
}
else res2=-1;
if(res2<res&&res2!=-1) res=res2;
//-------------------------------
// cout<<res1<<endl<<res2;
}
else {
int res3=0;
for(int i=1;i<=k-3;i++)
{
if(q[i]=='0') continue;
if(q[i]=='1')
{
q[i]='0';
q[i+1]=(q[i+1]=='1')?'0':'1';
q[i+2]=(q[i+2]=='1')?'0':'1';
res3++;
}
}
if(q[k-1]==q[k-2]) {
if(q[k-1]=='1')
{
res3++;
}
}
else res3=-1;
if(res3<res&&res3!=-1) res=res3;
}
if(res==1e8) cout<<"No"<<endl;
else cout<<res<<endl;
return 0;
}
这头像
我是y总忠诚的小粉丝
我也是+1