1.比赛分数:
共4题,满分400,比赛中得0分,4题0分。
因为头上的freopen(".in","r",stdin);
freopen(".out","w",stdout);
没有写名字,所以都0分。
2.比赛过程:
第1题开始想用满60近1的方法,可是没有想到会超过24小时。
第2题开始想用直接用最大的减最小的。
第3题开始想用价格直接加到累加器上。
第4题开始我把重复的组合。
3题解报告:
(1)
情况:赛中0分,已补题。
题意:输入开始时间和结束时间还有过程时间。
题解:将开始时间和结束时间还有过程时间都算成秒。
错思路:满60近1。
错代码:
#include <cstdio>
#include <iostream>
using namespace std;
struct now{
int h1,m1,s1;
}a;
struct k{
int h2,m2,s2;
}b;
int main(){
int p,q;
int x,y;
cin>>a.h1>>a.m1>>a.s1>>b.h2>>b.m2>>b.s2;
cin>>p>>q;
int t=p+q;
while(t>=60){
x++;
t=t-60;
}
while(t>=60){
y++;
t=t-60;
}
a.h1=a.h1+y;
a.m1=a.m1+x;
a.s1=a.s1+t;
if(a.m1>=60){
a.h1++;
a.m1-=60;
}else if(a.s1>=60){
a.m1++;
a.s1-=60;
}
if(a.h1<=b.h2){
if(a.m1<=b.m2){
if(a.s1<=b.s2){
cout<<"Yes";
return 0;
}
}
}
cout<<"No";
return 0;
}
对思路:
将开始时间和结束时间还有过程时间都算成秒,然后计算。
对代码:
#include <cstdio>
#include <iostream>
using namespace std;
int main(){
long long h1,m1,s1,h2,m2,s2,p,q;
scanf("%lld:%lld:%lld",&h1,&m1,&s1);
scanf("%lld:%lld:%lld",&h2,&m2,&s2);
cin>>p>>q;
long long sum1=s1+m1*60+h1*3600+p+q;
long long sum2=s2+m2*60+h2*3600;
if(sum1<sum2){
cout<<"Yes";
}else{
cout<<"No";
}
return 0;
}
(2)
情况:赛中0分,已补题。
题意:从s数组里的一个数+或-k,让最大值减最小值。
题解:让第1个数组的最大的减k,让第2个数组的最小的加k。
错思路:直接最大值减最小值。
错代码:
#include <bits/stdc++.h>
using namespace std;
int main(){
int n,k,s[1000],a[1000];
cin>>n>>k;
for(int i=1;i<=n;i++){
cin>>s[i];
}
sort(s+1,s+1+n);
s[n]=s[n]-k;
s[1]=s[1]+k;
cout<<s[n]-s[1];
return 0;
}
对思路:
让第1个数组的最大的减k,让第2个数组的最小的加k,再算出两个数组最大和最小的差。
对代码:
#include <bits/stdc++.h>
using namespace std;
int main(){
int n,k,s[100005],a[100005],b[100005],s1=0,s2=0;
cin>>n>>k;
k=abs(k);
for(int i=1;i<=n;i++){
cin>>s[i];
a[i]=s[i];
b[i]=s[i];
}
sort(a+1,a+1+n);
sort(b+1,b+1+n);
a[1]+=k;
b[n]-=k;
sort(a+1,a+1+n);
sort(b+1,b+1+n);
s1=a[n]-a[1];
s2=b[n]-b[1];
cout<<min(s1,s2);
return 0;
}
(3)
情况:赛中0分,已补题。
题意:输入n个物品价格和k个折扣券。
题解:利用双指针。
错思路:当时没思路。
错代码:
#include <cstdio>
#include <iostream>
using namespace std;
int main(){
int n,k,t,b[4000]={0};
cin>>n>>k;
int max=0,min=114514,sum=0;
for(int i=1;i<=n;i++){
cin>>t;
//clllout<<a[i];
bool j=0;
while(k!=0){
for(int i=1;i<=n;i++){
if(t>max){
max=t;
j=1;
}else if(t<min){
min=t;
j=1;
//cout<<a[i]<<" ";
}
if(j==0){
b[i]=t;
}
}
sum=sum+min*2;
n=n-2;
//cout<<min<<" ";
k--;
}
}
for(int i=1;i<=n;i++){
sum=sum+b[i];
}
cout<<sum;
return 0;
}
对思路:
双指针。
对代码:
#include <bits/stdc++.h>
using namespace std;
const int N=1e6+10;
long long n,k,a[N];
int main(){
cin>>n>>k;
for(int i=1;i<=n;i++){
cin>>a[i];
}
sort(a+1,a+1+n);
long long l=1,r=n,s=0;
while(k--&&l<=r){
s+=a[l];
l++;
r--;
}
while(l<=r){
s+=a[r];
r-=2;
}
cout<<s;
return 0;
}
(4)
情况:赛中0分,已补题。
题意:多组测试,第一行一个整数 t,表示测试组数。然后对于每组测试数据,输入一个字符串s
题解:循环输入s,并求长度和用不去重桶标记记录出现次数最多的字符(?除外),如有问号加到最多的里面,然后用等差数列公式,最后输出。
错思路:不会。
错代码:
#include <cstdio>
#include <iostream>
using namespace std;
int main(){
freopen(".in","r",stdin);
freopen(".out","w",stdout);
int n;
cin>>n;
string s;
int cnt=0;
while(n!=0){
cin>>s;
int len=s.size();
for(int i=0;i<=len-2;i++){
for(int j=i+1;j<=len-1;j++){
if(s[j]=='?'&&s[i]>=65&&s[i]<=122){
cnt++;
break;
}
if(s[i]=='?'&&s[j]>=65&&s[j]<=122){
cnt++;
break;
}
if(s[i]==s[j]){
cnt++;
break;
}
}
}
cout<<cnt<<endl;
n--;
}
fclose(stdin);
fclose(stdout);
return 0;
}
对思路:
循环输入s,并求长度和用不去重桶标记记录出现次数最多的字符(?除外),如有问号加到最多的里面,然后用等差数列公式。
对代码:
#include<bits/stdc++.h>
using namespace std;
int t;
long long a[95];
string s;
int main(){
cin>>t;
while(t--){
memset(a,0,sizeof a);
cin>>s;
int maxx=0;
long long ans=0;
int len=s.size();
int temp;
for(int i=0;i<len;i++){
a[s[i]]++;
if(s[i]!='?'){
if(a[s[i]]>maxx){
maxx=a[s[i]];
temp=s[i];
}
}
}
if(a['?']==0){
for(int j=65;j<=90;j++){
ans+=a[j]*(a[j]-1)/2;
}
}else{
a[temp]+=a['?'];
for(int j=65;j<=90;j++){
ans+=a[j]*(a[j]-1)/2;
}
}
cout<<ans<<"\n";
}
return 0;
}