C:
很简单一道签到题,3不用管,把1和2先尽可能合并掉,然后剩下的自己合并。
打的时候2合并了两次一直算成代价2,死活过不去 本周+5道罚题
下附代码:
1 #include<bits/stdc++.h> 2 #define ll long long 3 using namespace std; 4 int main(){ 5 ll a,b,c; 6 scanf("%lld%lld%lld",&a,&b,&c); 7 if (a==b){ 8 ll ret=a*2; 9 printf("%lld",ret); 10 } 11 else if (a>b){ 12 ll ret=b*2; 13 a-=b; 14 ret+=3*(a/3); 15 if (a%3==2) ret+=1; 16 printf("%lld",ret); 17 } 18 else { 19 ll ret=a*2; 20 b-=a; 21 ret+=6*(b/3); 22 if (b%3==2) ret+=4; 23 printf("%lld",ret); 24 } 25 }
D:
排序完之后按照相同的R作为等级,按照L赋值。
题目里说了排名大等于原来,也就是说本来要差的几个人往前面并列是可以接受的,打的时候没看见,wa了好久。
再加+5罚题
下附代码:
1 #include<bits/stdc++.h> 2 #define ll long long 3 using namespace std; 4 struct node{ 5 ll l,r,w; 6 }a[100005]; 7 bool cmp(node x,node y){ 8 return x.r<y.r; 9 } 10 int main(){ 11 int n; 12 scanf("%d",&n); 13 for(int i=1;i<=n;i++){ 14 scanf("%lld%lld",&a[i].l,&a[i].r); 15 } 16 sort(a+1,a+1+n,cmp); 17 ll sum=0; 18 ll maxl=0; 19 a[0].r=a[1].r-1; 20 ll num=0; 21 a[n+1].r=a[n].r+1; 22 for(int i=1;i<=n+1;i++){ 23 if(a[i].r!=a[i-1].r){ 24 sum+=num*maxl; 25 maxl=max(maxl,a[i].l); 26 num=1; 27 } 28 else { 29 maxl=max(1ll*a[i].l,maxl); 30 num++; 31 } 32 } 33 printf("%lld ",sum); 34 }
L:
数位DP,处理出除了后七位以外其他的1的奇偶性以及进位后的奇偶性,然后直接枚举找答案。
下附代码:
1 #include<bits/stdc++.h> 2 #define ll long long 3 using namespace std; 4 ll dp[100][2][2],a[105]; 5 ll dim[100]; 6 ll m,l; 7 ll cal(int jb,int sum,int st){ 8 ll ret=0,maxn=127; 9 if (jb) maxn=l%128; 10 for (int i=0; i<=maxn; i++){ 11 int flag=1; 12 for (int j=0; j<m; j++){ 13 if (i+j<128){ 14 if ((__builtin_parity(i+j)^sum)!=a[j]){ 15 flag=0; 16 break; 17 } 18 } 19 else if ((__builtin_parity(i+j)^sum^st)!=a[j]){ 20 flag=0; 21 break; 22 } 23 } 24 if (flag) ret++; 25 } 26 return ret; 27 } 28 ll dfs(int x,int sum,int st,int jb){ 29 if (x<=7){ 30 return cal(jb,sum,st); 31 } 32 if (!jb && dp[x][sum][st]!=-1) return dp[x][sum][st]; 33 int maxn=1; 34 if (jb) maxn=dim[x]; 35 ll ret=0; 36 for (int i=0; i<=maxn; i++){ 37 if (i==1) ret+=dfs(x-1,sum^i,st^1,(jb==1 && maxn==i)); 38 else ret+=dfs(x-1,sum,0,(i==maxn && jb==1)); 39 } 40 if (!jb) return dp[x][sum][st]=ret; 41 return ret; 42 } 43 int main(){ 44 int T; 45 scanf("%d",&T); 46 while (T--){ 47 memset(dp,-1,sizeof(dp)); 48 scanf("%lld%lld",&m,&l); 49 for (int i=0; i<m; i++) 50 scanf("%lld",&a[i]); 51 ll tmp=l; 52 int len=0; 53 while (tmp){ 54 dim[++len]=tmp%2; 55 tmp/=2; 56 } 57 printf("%lld ",dfs(len,0,0,1)); 58 } 59 }