比赛网页链接
https://ac.nowcoder.com/acm/contest/11471?from=acm_calendar#question
题目从易到难排序了
签到J. 比赛开始了清楚姐姐喊了一句:签到了签到了
遍历找最小更新序号。
#include<bits/stdc++.h>
using namespace std;
int a[10005];
int n;
int main()
{
scanf("%d",&n);
int x=-1;
int minv=1e9;
for(int i=0;i<n;i++)
{
scanf("%d",&a[i]);
if(a[i]<minv)
{
x=i+1;
minv=a[i];
}
}
printf("%d\n",x);
return 0;
}
签到H.cg写项目
sort练习题
#include<bits/stdc++.h>
using namespace std;
#define ll long long
struct student
{
string a;
string b;
string c;
string d;
int sign;
}s[105];
bool cmp(student A,student B)
{
if(A.a.size()!=B.a.size())
return A.a.size()<B.a.size();
else if(A.a!=B.a)
{
return A.a<B.a;
}
else
{
return A.sign<B.sign;
}
}
int n;
int main()
{
scanf("%d",&n);
for(int i=0;i<n;i++)
{
cin>>s[i].a>>s[i].b>>s[i].c>>s[i].d;
s[i].sign=i;
}
sort(s,s+n,cmp);
for(int i=0;i<n;i++)
{
cout<<s[i].a<<' '<<s[i].b<<' '<<s[i].c<<' '<<s[i].d;
puts("");
}
return 0;
}
签到 I.cg写项目加强版
除了数组大小不同,我没感觉和H有什么区别
#include<bits/stdc++.h>
using namespace std;
#define ll long long
struct student
{
string a;
string b;
string c;
string d;
int sign;
}s[100005];
bool cmp(student A,student B)
{
if(A.a.size()!=B.a.size())
return A.a.size()<B.a.size();
else if(A.a!=B.a)
{
return A.a<B.a;
}
else
{
return A.sign<B.sign;
}
}
int n;
int main()
{
scanf("%d",&n);
for(int i=0;i<n;i++)
{
cin>>s[i].a>>s[i].b>>s[i].c>>s[i].d;
s[i].sign=i;
}
sort(s,s+n,cmp);
for(int i=0;i<n;i++)
{
cout<<s[i].a<<' '<<s[i].b<<' '<<s[i].c<<' '<<s[i].d;
puts("");
}
return 0;
}
F. happy的异或运算
思(gui)维(lv)题,看样例找规律,看能除以多少个2就行,除的时候向下取整不用处理,只需特判1即可。
#include<bits/stdc++.h>
using namespace std;
#define ll long long
ll n;
long long fastPower(long long base, long long power) {
long long result = 1;
while (power > 0) {
if (power & 1) {
//此处等价于if(power%2==1)
result = result * base ;
}
power >>= 1;//此处等价于power=power/2
base = (base * base) ;
}
return result;
}//快速幂板子
int main()
{
scanf("%lld",&n);
if(n==1)
{
printf("0\n");
}
else
{
ll sum=0;
while(n)
{
n=n/2;
sum++;
}
ll res=fastPower(2,sum)-1;
printf("%lld\n",res);
}
return 0;
}
G.Alan%%%
硬暴力就行,我拿的字符数组c语言写的,唯一一个c提交代码
#include<stdio.h>
int n,m;
int main()
{
scanf("%d",&n);
getchar();
int sum=0;
for(int ii=0;ii<n;ii++)
{
char a[1005];
int res=0;
gets(a);
int y=strlen(a);
for(int i=0;i<y;i++)
{
if(a[i]=='%')
res++;
}
int flag=0;
for(int i=0;i<y&&!flag;i++)
{
int flag1=0;
if(a[i]=='A')
{
for(int j=i+1;j<y&&!flag1;j++)
{
int flag2=0;
if(a[j]!=' '&&a[j]!='l')
{
break;
}
else if(a[j]=='l')
{
for(int k=j+1;k<y&&!flag2;k++)
{
if(a[k]!=' '&&a[k]!='a')
{
flag1=1;
break;
}
else if(a[k]=='a')
{
for(int p=k+1;p<y;p++)
{
if(a[p]!=' '&&a[p]!='n')
{
flag2=1;
break;
}
else if(a[p]=='n')
{
flag2=1;
flag1=1;
flag=1;
break;
}
}
}
}
}
}
}
}
if(flag)
{
sum+=res;
}
}
printf("%d\n",sum);
return 0;
}
C. gg查成绩
这题云哥说榜歪了,但是属于会的就会,而且巨简单,不会就是不会,做法就是入门前缀和,了解前缀和的都很轻松。
#include<bits/stdc++.h>
using namespace std;
int a[1000005];
int n,m;
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
}
for(int i=1;i<=n;i++)
{
a[i]+=a[i-1];
}
for(int i=0;i<m;i++)
{
int x,y;
scanf("%d%d",&x,&y);
printf("%d\n",a[y]-a[x-1]);
}
return 0;
}
B.群友们在排列数字
dfs全排列数就行,但是做的时候,一个是没有在0的时候输出-1,一个是没开long long WA了好几发,罚时罚上天,顺带一提,按我这样把数组换成数,我第一发交的时候用的pow,直接超时1001ms,所以用了快速幂板子,快速幂还是香啊。
#include<bits/stdc++.h>
using namespace std;
long long a[10];
long long n,k;
long long st[10];
long long sum=0;
long long fastPower(long long base, long long power) {
long long result = 1;
while (power > 0) {
if (power & 1) {
//此处等价于if(power%2==1)
result = result * base ;
}
power >>= 1;//此处等价于power=power/2
base = base * base;
}
return result;
}
long long fun()
{
long long sum1=0;
for(long long i=0;i<n;i++)
{
sum1+=a[i]*fastPower(10,i);
}
return sum1;
}
void dfs(long long step)
{
long long i;
if(step==n)
{
long long x=fun();
if(x%k==0)
{
sum++;
}
return;
}
for(i=0;i<=n-1;i++)
{
if(!st[i])
{
a[step]=i;
st[i]=1;
dfs(step+1);
st[i]=0;
}
}
return;
}
int main()
{
scanf("%d%d",&n,&k);
dfs(0);
if(sum==0)
{
printf("-1\n");
}
else
printf("%lld\n",sum);
return 0;
}
D.issue与lifehappy给学生分组
二分应用题
#include<bits/stdc++.h>
using namespace std;
#define ull unsigned long long int
#define INF 1e12
ull a[1000005];
ull n,m;
ull juge(ull mid)
{
ull seg = 0;
ull sum = 0;
for (ull i = 0; i < n; i++)
{
sum += a[i];
if (sum > mid)
{
sum = a[i];
seg++;
}
}
if (seg >= m)
return 0;
else
return 1;
}
ull value(ull low, ull high)
{
if (low > high)
return high + 1;
else
{
ull mid = (low + high) / 2;
if (juge(mid))
return value(low, mid - 1);
else
return value(mid + 1, high);
}
}
int main()
{
scanf("%llu%llu",&n,&m);
ull min = INF, max = 0;
for (ull i = 0; i < n ; i ++)
{
scanf("%llu",&a[i]);
max += a[i];
if (a[i] < min)
min = a[i];
}
ull res = value(min, max);
printf("%llu\n",res);
return 0;
}
比赛时就ac了8题,二十多个ak,但是我还是不能ak,我太菜了,后面找时间把A,E补了,A在群里的时候很多人都说卡读入。
补题:
E. 删删删越小越好
从高位往低位遍历,核心思路是越靠近高位的数字越小越好,对于第 i 个位置的数字,如果左边的数字(1 ~ i-1)位置有比它大的,则删去第 i 个数字左边的数字,直到无法删除或者第 i 个数字左边的数字都小于等于第 i 个数字。剩下的即为答案。
#include<bits/stdc++.h>
using namespace std;
const int N = 2e7+10;
string x;
int n;
char f[N];
int len;
int cnt;
int main()
{
ios::sync_with_stdio(false);
cin>>x;
cin>>n;
int t=x.size();
for(int i=0;i<x.size();i++)
{
while(cnt!=n&&x[i]<f[len]&&len!=0)
{
len--;
cnt++;
}
f[++len]=x[i];
}
int flag=0;
for(int i=1;i<=len-(n-cnt);i++)
{
if(f[i]!='0')
{
flag=1;
}
if(flag)
{
printf("%c",f[i]);
}
}
if(!flag)
{
printf("0\n");
}
return 0;
}
A.数组截取
本场指定唯一卡常题,卡读入卡到飞起,群里一片哀鸿遍野,说会本题,撇开卡常读入外,做法是前缀和思想+双指针,核心代码不算难。
#include<bits/stdc++.h>
using namespace std;
long long a[20002000];
inline long long read(){
long long x = 0;
char ch = getchar();
while(ch < '0' || ch > '9'){
ch = getchar();
}
while(ch >= '0' && ch <= '9'){
x = (x<<1) + (x<<3) + (ch^48);
ch = getchar();
}
return x;
}
int main()
{
long long n=read();
long long k=read();
long long sum=0,MAX=0,j=0;
for(long long i=0;i<n;i++)
{
a[i]=read();
sum+=a[i];
while(sum>k) sum-=a[j++];
if(sum==k) MAX=max(MAX,i-j+1);
}
if(!MAX)
{
printf("-1\n");
}
else
{
printf("%lld\n",MAX);
}
return 0;
}