吐槽:一辈子要在DIV 2混了。
A,B,C都是简单题,看AC人数就知道了。
A:如果我们定义数组为N*N的话就不用考虑边界了
1 #include2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #include 9 using namespace std;10 #define inf 0x3f3f3f11 #define N 1234512 typedef long long ll;13 int a[N];14 char s[123][123];15 int main()16 {17 int n;18 scanf("%d",&n);19 for (int i=1;i<=n;i++)20 scanf("%s",s[i]+1);21 22 int flag=1;23 for (int i=1;i<=n;i++)24 for (int j=1;j<=n;j++){25 int ans=0;26 if (s[i-1][j]=='o') ans++;27 if (s[i][j-1]=='o') ans++;28 if (s[i][j+1]=='o') ans++;29 if (s[i+1][j]=='o') ans++;30 if (ans&1) {flag=0;break;}31 }32 33 if (flag) printf("YES");34 else printf("NO");35 return 0;36 }
B:语文实在...。。
可以是贪心。。。
只要对26个字母排序
233
1 #include2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #include 9 using namespace std;10 #define inf 0x3f3f3f11 #define N 12345612 typedef long long ll;13 ll a[N];14 string s;15 int main()16 {17 int n;18 ll k;19 cin>>n>>k;20 cin>>s;21 for (int i=0;i =0;i--)26 {27 if (k>=a[i]) {ans+=a[i]*a[i];k-=a[i];28 }29 else {ans+=k*k;break;}30 }31 cout< <
这题也是贪心做法。。
因为我们要加的数的个数是一定的。。。
如果排序好,尽量加大的,就OK了。。所以每次我们把最小的踢出去。
就可以算出每个数要加多少。
1 #include2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #include 9 using namespace std;10 #define inf 0x3f3f3f11 #define N 32345612 typedef long long ll;13 ll a[N];14 string s;15 int main()16 {17 int n;18 cin>>n;19 for (int i=1;i<=n;i++)cin>>a[i];20 ll ans=0;21 sort(a+1,a+n+1);22 for (int i=1;i
D:练了不少树形DP了,但是这题完全没思路。真是渣一辈子DIV 2。
思路:定义DP[I][1]表示以I为根的数中有BLACK节点
DP[I][0]表示没有BLACK节点。。
转移方程
U是ROOT的子节点
初始:DP[ROOT][COLOR[ROOT]]=1;
DP[ROOT][1]=DP[ROOT][1]*DP[U][1]+DP[ROOT][0]*DP[U][1]+DP[ROOT][1]*DP[U][0];
DP[ROOT][0]=DP[ROOT][0]*DP[U][0]+DP[ROOT][0]*DP[U][1];
1 #include2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #define N 112345 9 #define inf 100000000710 typedef long long ll;11 using namespace std;12 vector G[N];13 ll dp[N][2];14 int col[N];15 int n;16 17 18 void dfs(int root,int pre)19 {20 dp[root][col[root]]=1;21 for (int i=0;i
后记:
树形DP比较抽象。。。多做题才能提高