第二次组队赛,拿了个倒数第一,真是印象深刻,各方面的原因都有一点,主要是现在太菜了
赛后攻题,持续更新
A - Chuanpai
#include<stdio.h>
int main()
{
int t,i,j,n;
scanf("%d",&t);
while(t--)
{
int sum = 0;
scanf("%d",&n);
for(i=1;i<=6;i++)
{
for(j=1;j<=i;j++)
{
if(i+j == n)
{
sum++;
}
}
}
printf("%d\n",sum);
}
return 0;
}
B - Hotpot
//哈希表的简单应用,注意数据可能过大,要找规律。
#include<stdio.h>
#include<iostream>
#include<string.h>
#define Max 100005
using namespace std;
int has[Max];
int favor[Max];
int ans[Max];
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
memset(has,0,sizeof(has));
memset(ans,0,sizeof(ans));
memset(favor,0,sizeof(favor));
int n,k,m,i;
cin>>n>>k>>m;
for(i=0;i<n;i++)
{
cin>>favor[i];
}
if(m>=2*n)
{
int f = m/(2*n);
int k = m%(2*n);
for(i=0;i<2*n;i++)
{
int j = i%n;
if(has[favor[j]]==0)
{
has[favor[j]]++;
}
else
{
has[favor[j]]--;
ans[j]++;
}
}
for(i=0;i<n;i++)
ans[i] *= f;
for(i=0;i<k;i++)
{
int j = i%n;
if(has[favor[j]]==0)
{
has[favor[j]]++;
}
else
{
has[favor[j]]--;
ans[j]++;
}
}
}
else
{
for(i=0;i<m;i++)
{
int j = i%n;
if(has[favor[j]]==0)
{
has[favor[j]]++;
}
else
{
has[favor[j]]--;
ans[j]++;
}
}
}
for(i=0;i<n-1;i++)
printf("%d ",ans[i]);
printf("%d\n",ans[i]);
}
return 0;
}
//以下是队友没找到规律暴力没过的代码
/*#include <stdio.h>
#include <stdlib.h>
#include <algorithm>
#include <string.h>
#include <math.h>
using namespace std;
#define MAXV 100010
int hashv[MAXV];
int favor[MAXV]; //客户最喜欢的
int xinyun[MAXV];
void fun(int n,int k,int m)
{
int i,j;
memset(hashv,0,sizeof(hashv));
i=0;
for(j=1;j<=m;j++)
{
i++;
//printf("the current i:%d\n",i);
if(i%n!=0)
i=i%n;
else if(i%n==0)
i=n;
//printf("iis %d\n",i);
if(hashv[favor[i]]==0)
hashv[favor[i]]++; //放一个喜欢的进去
else if(hashv[favor[i]])
{
hashv[favor[i]]--;
xinyun[i]++;
//printf("%d %d\n",i,xinyun[i]);
}
}
}
int main()
{
int T,n,k,m,i;
scanf("%d",&T);
while(T--)
{
scanf("%d%d%d",&n,&k,&m);
for(i=1;i<=n;i++)
{
scanf("%d",&favor[i]);
xinyun[i]=0;
}
fun(n,k,m);
for(i=1;i<=n;i++)
{
if(i!=n)
printf("%d ",xinyun[i]);
else printf("%d\n",xinyun[i]);
}
}
}
*/
D - Rock Paper Scissors
队友ac代码
#include <iostream>
using namespace std;
int main()
{
long long br,bp,bs;//石头,布,剪刀
long long dr,dp,ds;
int t;
cin>>t;
while(t--)
{
cin>>br>>bp>>bs;
cin>>dr>>dp>>ds;
long long b[3]={br,bp,bs};
long long d[3]={dr,dp,ds};
long long sum=0;
int i,j;
long long D;
D=(b[0]<=d[1]?b[0]:d[1]);//bob石头对dr布,总分增加
b[0]-=D;d[1]-=D;sum+=D;
D=(b[1]<=d[2]?b[1]:d[2]);//bob布对dr剪刀,总分增加
b[1]-=D;d[2]-=D;sum+=D;
D=(b[2]<=d[0]?b[2]:d[0]);//bob剪刀对dr石头,总分增加
b[2]-=D;d[0]-=D;sum+=D;
for(i=0;i<3;i++)//两人逐项平局
{
D=(b[i]<=d[i]?b[i]:d[i]);
b[i]-=D;
d[i]-=D;
sum-=b[i];//减去应该失去的分数
}
cout<<sum<<endl;
}
return 0;
}
/*在队友的讲解下a了
#include<stdio.h>
#include<iostream>
using namespace std;
int main()
{
int t;
long long ans;
long long x,y,z,a,b,c;
scanf("%d",&t);
while(t--)
{
ans = 0;
long long d = 0;
scanf("%lld%lld%lld",&x,&y,&z);
scanf("%lld%lld%lld",&a,&b,&c);
//前面三个算d的加分
d = x>b?b:x;
x -=d;
b -=d;
ans +=d;
d = y>c?c:y;
y -=d;
c -=d;
ans +=d;
d = z>a?a:z;
z -=d;
a -=d;
ans +=d;
//接下来算d和b的平分
d = x>a?a:x;
x -=d;
a -=d;
d = y>b?b:y;
y -=d;
b -=d;
d = z>c?c:z;
z -=d;
c -=d;
//最后剩余的就是b要减去的分
ans -=(x+y+z);
printf("%lld\n",ans);
}
return 0;
}*/
H - Nihongo wa Muzukashii Desu
#include<stdio.h>
#include<string.h>
int main()
{
int t;
char s[35],a[35];
scanf("%d",&t);
getchar();
while(t--)
{
scanf("%s",s);
getchar();
if(strcmp(s,"ikimasu")==0)
{
printf("itte\n");
continue;
}
else if(strcmp(s,"isogimasu")==0)
{
printf("isoide\n");
continue;
}
else
{
int l = strlen(s);
if(s[l-7] == 's'&&s[l-6] == 'h'&&s[l-5] =='i')
{
s[l-7] = '\0';
printf("%sshite\n",s);
continue;
}
else if(s[l-7] == 'c'&&s[l-6] == 'h'&&s[l-5] == 'i')
{
s[l-7] = '\0';
printf("%stte\n",s);
continue;
}
else if(s[l-6] == 'm'&&s[l-5] == 'i')
{
s[l-6] = '\0';
printf("%snde\n",s);
continue;
}
else if(s[l-6] == 'b'&&s[l-5] == 'i')
{
s[l-6] = '\0';
printf("%snde\n",s);
continue;
}
else if(s[l-6] == 'n'&&s[l-5] == 'i')
{
s[l-6] = '\0';
printf("%snde\n",s);
continue;
}
else if(s[l-6] == 'k'&&s[l-5] == 'i')
{
s[l-6] = '\0';
printf("%site\n",s);
continue;
}
else if(s[l-6] == 'r'&&s[l-5] == 'i')
{
s[l-6] = '\0';
printf("%stte\n",s);
continue;
}
else if(s[l-6] == 'g'&&s[l-5] == 'i')
{
s[l-6] = '\0';
printf("%side\n",s);
continue;
}
else if(s[l-5] == 'i')
{
s[l-5] == '\0';
printf("%stte\n",s);
}
}
}
return 0;
}
K - K-skip Permutation
#include<stdio.h>
#include<iostream>
using namespace std;
int main()
{
int n, k;
scanf("%d%d",&n,&k);
int cnt = 0;
int i,j;
for (i = 1; i <= n; i++)
{
for (j = 0; j *k + i <= n; j++)
{
++cnt;
if (cnt < n)
{
printf("%d ",j*k+i);
}
else
{
printf("%d",j*k+i);
}
}
if(cnt == n)
break;
}
return 0;
}
M - True Story
注意这题有个小坑就是速度*时间的值可能很大超过int型,要额外定义个类型装他们的值,因为这个原因白白wa二次。
#include<stdio.h>
#include<iostream>
#include<algorithm>
using namespace std;
#define Max 100005
int s[Max];
int p0[Max],p1[Max],p3[Max];
int main()
{
int n,k,d,p,i;
int sum = 0;
long long x=0,MAX = 0;
cin>>n>>k>>d>>p;
for(i=0;i<n;i++)
{
cin>>s[i];
}
sort(s,s+n);
for(i=n-1;i>=0;i--)
{
x = s[i] *p;
if(x>=d)
{
sum++;
s[i] = 0;
}
}
for(i=0;i<k;i++)
{
cin>>p0[i];
}
for(i=0;i<k;i++)
{
cin>>p1[i];
}
for(i=0;i<k;i++)
{
p3[i] = p1[i] -p0[i];
if(p3[i] > MAX)
{
MAX = p3[i];
}
}
//printf("%d\n",MAX);
for(i=0;i<n;i++)
{
x = s[i] *MAX;
if(x >= d)
{
//printf("%d ",i);
sum++;
}
}
cout<<sum<<endl;
return 0;
}