0%

Codeforces Div 2 C 天梯 11——15

http://codeforces.com/problemset/problem/363/C 傻逼题 模拟一下就行了,注意一下标记

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
#include<bits/stdc++.h>
using namespace std;
string s;
int bj;
int b;
int main()
{
b=0;
bj=0;
cin>>s;
cout<<s[0];
for(int i=1;i<s.size();i++)
{
if(s[i]!=s[i-1])
{
cout<<s[i];
b=0;
if(bj!=0) bj--;
}
else if(s[i]==s[i-1])
{
if(b==0&&bj==0)
{
cout<<s[i];
bj=2;
b=1;
}
}
}
return 0;
}

http://codeforces.com/problemset/problem/490/C 正着算一下,反着算一下,然后看看正反能不能接起来 反着算的时候需要预处理,这里愚蠢的我想了一会儿才想到...

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
#include<bits/stdc++.h>
using namespace std;
string s;
long long a,b;
long long u;
bool p[1000010]={};
int q[1000010]={};
int main()
{
cin>>s>>a>>b;
u=1;
q[0]=1;
for(int i=1;i<=s.size();i++)
{
u*=10;
q[i]=u%b;
u%=b;
}
u=0;
for(int i=0;i<s.size();i++)
{
u*=10;
u+=s[i]-'0';
if(u%a==0)
{
p[i+1]=1;
}
u%=a;
}
u=0;
bool bj=0;
for(int i=s.size()-1;i>=0;i--)
{
if(s[i]!='0') bj=1;
long long o=s[i]-'0';
o*=q[s.size()-1-i];
u+=o;
u%=b;
if(u%b==0&&bj==1&&p[i]==1)
{
cout<<"YES"<<endl;
for(int j=0;j<i;j++) cout<<s[j];
cout<<endl;
for(int j=i;j<s.size();j++) cout<<s[j];
return 0;
}
}
cout<<"NO";
return 0;
}

http://codeforces.com/problemset/problem/463/C 这题...坑太多...交了好几次才过... 思路其实不是很难,就是找一找交错的对角线,各种预处理就行 但是特殊数据好多啊...这要是考试我肯定写不出来...

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
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
#include<bits/stdc++.h>
using namespace std;
long long n;
long long e[2010][2010]={};
long long h[2][2][2010][2010]={};
bool v[2][2][2010][2010]={};
bool a,b;
long long u;
bool q[2][2]={};
int main()
{
scanf("%I64d",&n);
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
scanf("%I64d",&e[i][j]);
}
}
a=0;
b=0;
for(int i=1;i<n;i++)
{
b=!b;
u=0;
int x,y;
x=1; y=i;
while(x>=1&&x<=n&&y>=1&&y<=n)
{
u+=e[x][y];
x++;
y--;
}
x=1; y=i;
while(x>=1&&x<=n&&y>=1&&y<=n)
{
h[a][b][x][y]=u;
v[a][b][x][y]=1;
x++;
y--;
}
}
for(int i=1;i<=n;i++)
{
b=!b;
u=0;
int x,y;
x=i; y=n;
while(x>=1&&x<=n&&y>=1&&y<=n)
{
u+=e[x][y];
x++;
y--;
}
x=i; y=n;
while(x>=1&&x<=n&&y>=1&&y<=n)
{
h[a][b][x][y]=u;
v[a][b][x][y]=1;
x++;
y--;
}
}
a=1;
b=0;
for(int i=n;i>1;i--)
{
b=!b;
u=0;
int x,y;
x=i; y=1;
while(x>=1&&x<=n&&y>=1&&y<=n)
{
u+=e[x][y];
x++;
y++;
}
x=i; y=1;
while(x>=1&&x<=n&&y>=1&&y<=n)
{
h[a][b][x][y]=u;
v[a][b][x][y]=1;
x++;
y++;
}
}
for(int i=1;i<=n;i++)
{
b=!b;
u=0;
int x,y;
x=1; y=i;
while(x>=1&&x<=n&&y>=1&&y<=n)
{
u+=e[x][y];
x++;
y++;
}
x=1; y=i;
while(x>=1&&x<=n&&y>=1&&y<=n)
{
h[a][b][x][y]=u;
v[a][b][x][y]=1;
x++;
y++;
}
}
long long ans=0;
long long an=-1;
int x,y;
a=0; b=0; x=1; y=1;
if(n%2==1) y=!y;
int xx,yy;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(v[a][b][i][j]&&v[x][y][i][j])
{
u=h[a][b][i][j]+h[x][y][i][j]-e[i][j];
if(u>an)
{
xx=i;
yy=j;
an=u;
}
}
}
}
ans+=an;
int xi,yi;
a=0; b=1; x=1; y=0;
if(n%2==1) y=!y;
an=-1;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(v[a][b][i][j]&&v[x][y][i][j])
{
u=h[a][b][i][j]+h[x][y][i][j]-e[i][j];
if(u>an)
{
xi=i;
yi=j;
an=u;
}
}
}
}
ans+=an;
cout<<ans<<endl;
cout<<xx<<" "<<yy<<" "<<xi<<" "<<yi<<endl;
return 0;
}
http://codeforces.com/problemset/problem/152/C 我感觉这题思路不是很好想到...虽然很简单...就是记录一下每一位的不同字母的个数就行 需要一定的透过现象看本质的能力...
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>
#define mod 1000000007ll
using namespace std;
string s[101];
int n,m;
long long q[101]={};
bool vis[101][27]={};
long long ans;
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
{
cin>>s[i];
for(int j=0;j<s[i].size();j++)
{
if(vis[j][s[i][j]-'0']==0)
{
vis[j][s[i][j]-'0']=1;
q[j]++;
}
}
}
ans=1ll;
for(int i=0;i<=m-1;i++)
{
ans*=q[i];
ans%=mod;
}
cout<<ans;
return 0;
}
http://codeforces.com/problemset/problem/109/A 很简单的贪心,就是一直取4,然后看剩下的能不能都取7就行
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
#include<bits/stdc++.h>
using namespace std;
int ans[1000010]={};
int n;
int num;
int main()
{
cin>>n;
while(1)
{
if(n<0)
{
cout<<"-1";
return 0;
}
if(n%7==0)
{
while(1)
{
if(n==0) break;
num++;
ans[num]=7;
n-=7;
}
for(int i=1;i<=num;i++) cout<<ans[i];
cout<<endl;
return 0;
}
else
{
n-=4;
num++;
ans[num]=4;
}
}
return 0;
}