牛客寒假训练赛3

第三场,算是自闭了,唉…
我好菜啊
四题
https://ac.nowcoder.com/acm/contest/329#question


C:处女座点名
签到题
思路还是很清楚的,就是1-n之间有一个数缺少,数也是排好序的,很简单
就是注意需要考虑
2
1
这种数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include <bits/stdc++.h>
using namespace std;
int a[200005];
int main(){
int n;
cin>>n;
for(int i=0;i<n-1;i++){
cin>>a[i];
}
if(n==2){
if(a[0]==1)cout<<"2"<<endl;
else cout<<"1"<<endl;
}
else {
int ans;
if(a[0]!=1){
cout<<"1"<<endl;
return 0;
}
bool flag=false;;
for(int i=1;i<n-1;i++){
if(a[i]!=a[i-1]+1){
ans=a[i-1]+1;
flag=true;
break;
}
}
if(flag)cout<<ans<<endl;
else cout<<n<<endl;
}
return 0;
}

E:处女座的小姐姐
数学题,分奇偶一下就行

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <bits/stdc++.h>
using namespace std;
int main(){
int t;
cin>>t;
while(t--){
int n,m;
cin>>n>>m;
if(m%2==0){
cout<<n*(m+1)-2*n-1<<endl;
}
else cout<<n*m-2<<endl;
}
return 0;
}

D:处女座的训练
就这个题,WA了我12发
一开始就是想着先排后面再排前面
WA CODE:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include <bits/stdc++.h>
//#define int long long
using namespace std;
struct node{
int cost,w;
}cnm[10005];
bool cmp(node a ,node b){
if(a.cost==b.cost)return a.w>b.w;
else return a.cost<b.cost;
}
int main(){
int n;
cin>>n;
for(int i=0;i<n;i++){
int a,b;
cin>>a>>b;
cnm[i].cost=a;
cnm[i].w=b;
}
sort(cnm,cnm+n,cmp);
int sum=0;
int cnt=n;
node wyh=cnm[0];
while(n>1){
n--;
for(int i=cnt-n;i<cnt;i++){
sum+=wyh.cost*cnm[i].w;
}
wyh=cnm[cnt-n];
}
cout<<sum;
return 0;
}

样例过不了,然后又改成先排前面从小到大再到排后面从大到小,优先排前面的,然后所有我能想的数据都能过,但是就是WA,难受
到最后一个朋友和我说,排序是按性价比排,就是a/b的值,然后我改了之后样例不对,然后改成double强制转换,然后就样例对了
提交还是wa,我就发给我朋友看了下,他看了会说我的while循环可能出了问题,建议改成for,我就换了个思路就AC了
ac code :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
/*
输入
复制
6
6 1
4 5
4 3
6 2
8 1
2 6
输出
复制
86
*/
#include <bits/stdc++.h>
#define int long long
using namespace std;
struct node{
int cost,w;
}cnm[100005];
bool cmp(node a ,node b){
return double(a.cost)/double(a.w)<double(b.cost)/double(b.w);
}
signed main(){
int n;
cin>>n;
for(int i=0;i<n;i++){
int a,b;
cin>>a>>b;
cnm[i].cost=a;
cnm[i].w=b;
}
sort(cnm,cnm+n,cmp);
int sum=0;
for(int i=0;i<n;i++){
sum+=cnm[i].w;
}
int ans=0;
for(int i=0;i<n;i++){
sum-=cnm[i].w;
ans+=sum*cnm[i].cost;
}
cout<<ans<<endl;
return 0;
}

I:处女座的约会
这谁做的来啊。。。我是不会做,纯粹输出“cnznb”

1
2
3
4
5
6
7
8
9
#include <bits/stdc++.h>
using namespace std;
int main(){
int n;
cin>>n;
while(n--)
cout<<"cnznb"<<endl;
return 0;
}

G:
lz说这题是数位DP裸,然后HDU有原题 不要62:不要62
但是我不会,所以留个坑:
放个数位dp的博客在这:数位dp
lz的代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
long long l,r;
long long diag[19],dp[19][2];
long long p;
//dp[i][0]表示激动数字
//dp[i][1]表示非激动数字
long long num(long long x)
{
long long p=0;
long long sum=0,flag=0;
long long temp=x;
memset(diag,0,sizeof(diag));
while(temp!=0)
{
diag[++p]=temp%10;
temp/=10;
}
diag[p+1]=0;
for(long long i=p;i>=1;i--)
{
sum+=dp[i-1][0]*diag[i];
if(flag==1)
{
sum+=dp[i-1][1]*diag[i];
}
else
{
if(diag[i]>6)
{
sum+=dp[i-1][1];
}
}
if(diag[i]==6)
{
flag=1;
}
}
return sum;
}
int main()
{
memset(dp,0,sizeof(dp));
dp[0][0]=0;dp[0][1]=1;
for(int i=1;i<=18;i++)
{
dp[i][0]=dp[i-1][0]*10+dp[i-1][1];
dp[i][1]=dp[i-1][1]*9;
}
scanf("%lld%lld",&l,&r);
printf("%lld\n",num(r+1)-num(l));
return 0;
}

晚上本来报了CF的,上来做第一题,卡住了,心态就崩了 又好困好累然后就不想做了,就睡了
自闭了,难受

晚风。
coswindy

-------------本文结束感谢您的阅读-------------