A题,很简单,数学题,应该是4的倍数会满足两条边垂直。
B题,字符串操作的贪心题,读题要细致,注意还要最小化。所以最后一个删掉的得是1
具体看代码吧。
- 思路。先处理后面的10,把除了第一个1以外的1全部删掉,这样就会剩下第一个1和后面的0,然后把0删掉,最后把1的位置改成0.
- 代码
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define PII pair<int, int>
const int N = 15 + 10;
string a;
void solve()
{
int n;
cin >> n;
cin >> a;
int end;
int len = a.length();
for (int i = len - 1; i >= 0; i--)
{
if (a[i] == '0')
{
end = i;
break;
}
}
//cout<<end<<endl;
int st;
for (int i = 0; i < len; i++)
{
if (a[i] == '1')
{
st = i;
break;
}
}
//cout<<st<<endl;
for (int i = end - 1; i >= 0; i--)
{
if (a[i] == '1' && i != st)
{
a.erase(i, 1);
}
else
{
continue;
}
}
//cout<<a<<endl;
for (int i = st + 1; i < a.length(); i++)
{
if (a[i] == '0')
{
a.erase(i, 1);
i--;
}
else
break;
//cout<<a<<endl;
a[st]='0';
}
cout << a << endl;
}
int main()
{
int t;
cin >> t;
while (t--)
{
solve();
}
}
C题
- 思路
第一个数组从大到小排序,第二个数组从小到大排序。因为细节,wa了一次。
忘了更新指针了。 - 代码
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define PII pair<int, int>
const int N = 2e5 + 10;
ll a[N];
bool cmp(int a,int b)
{
return a>b;
}
ll K[N];
void solve()
{
int n,k;
cin>>n>>k;
for(int i=1;i<=n;i++)
cin>>a[i];
for(int i=1;i<=k;i++)
cin>>K[i];
sort(a+1,a+1+n,cmp);
sort(K+1,K+1+k);
ll res=0;
int z=k;
for(int i=1;i<=k;i++)
{
res+=a[i];
}
for(int i=1;i<=k;i++)
{
if(K[i]==1)
{
res+=a[i];
continue;
}
res+=a[z+K[i]-1];
z+=K[i]-1;
}
cout<<res<<endl;
}
int main()
{
int t;
cin >> t;
while (t--)
{
solve();
}
}
D题
- 题意
自己看去吧。 - 思路
自己理解,在扩展的过程中,因为对称性的原因,所以2*dp【i-2】,中间一枝是dp[i-1];
因为(手动模拟)扩展过程中,就会多出来一个claw。
- 代码
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define PII pair<int, int>
const int N = 2e6 + 10;
const ll mod = 1e9 + 7;
ll a[N];
ll dp[N];
void solve()
{
int n;
cin >> n;
ll res;
//if (n <= 100000)
res = (dp[n] + mod) % mod;
// else
// {
// for (int i = 100000; i <= n; i++)
// {
// dp[i] = (2 * dp[i - 2] + dp[i - 1]) % mod;
// if (i % 3 == 0)
// dp[i] = (dp[i] + 4) % mod;
// }
// res = (dp[n] + mod) % mod;
// }
cout << res << endl;
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
int t;
cin >> t;
dp[1] = dp[2] = 0;
for (int i = 3; i <= N; i++)
{
dp[i] = (2 * dp[i - 2] + dp[i - 1]) % mod;
if (i % 3 == 0)
dp[i] = (dp[i] + 4) % mod;
}
while (t--)
{
solve();
}
}