A.题意:看输入输出即可
red blue
3 4
red
2 4
思路:这个题不是很难,但是我一上去就想要用map,然后就很悲催,map里面人家按照键值给你排序,所以输出的时候会有错!
#include
#define pair p
using namespace std;
map<string,int> st;
int main(){
string s1;
string s2;
cin>>s1>>s2;
int n,m;
cin>>n>>m;
//st.insert(p(s1,n));
//st.insert(p(s2,m));
st[s1] = n;
st[s2] = m;
string ss;
cin>>ss;
st[ss]--;
//map::iterator it
for(auto it=st.begin();it!=st.end();it++){
//cout<first<second<<" ";
cout<<it->second<<" ";
}
return 0;
}
AC
可是我就是想用map,那么我就开两个了,当string一致时map的值不增加,但不一致值,就会加一。这样就能AC了,很是倔强啊!!就要用map,一个签到做了20多分钟。
#include
using namespace std;
//pair p;
map<string,int> st;
map<string,int> sd;
int main(){
string s1;
string s2;
cin>>s1>>s2;
int n,m;
cin>>n>>m;
st[s1] = n;
sd[s2] = m;
string ss;
cin>>ss;
st[ss]++;
sd[ss]++;
int len1 = st.size();
int len2 = sd.size();
if(len1 == 2){
cout<<n<<" "<<m-1<<endl;
}
if(len2 == 2){
cout<<n-1<<" "<<m<<endl;
}
return 0;
}
B水题.
题意:长度多少输出多少个字符,原来这个才是签到题!!!
看懂即A!
#include
using namespace std;
int main(){
string s;
cin>>s;
int len = s.length();
for(int i=0;i<len;i++){
cout<<"x";
}
return 0;
}
C链接
题意:就是问你给你一组数据后,里面是否有重复的数据,无则输出YES,否则输出NO!
思路:一开始想的太复杂了,想着开一个数组,然后就是输入的时候就对其进行处理,出现过一次那么我就在其位置上加一,但这样开数组很是浪费,占用空间很大,这里还存在一个细节的小问题,就是我循环开到1e9的话,编译是不成功的,所以我测试时将其缩小则能运行了,疑惑???
#include
#define maxn 200005
using namespace std;
typedef long long ll;
ll a[maxn];
ll vis[1000000];
int main(){
int n;
cin>>n;
int flag = 0;
memset(vis,0,sizeof(vis));
for(int i=0;i<n;i++){
cin>>a[i];
vis[a[i]]++;
}
for(ll i=0;i<=1000000;i++){
if(vis[i]>=2){
cout<<"NO"<<endl;
flag = 1;
break;
}
}
if(!flag){
cout<<"YES"<<endl;
}
return 0;
}
AC
然后我想到STL set 具有去重的功效,所以在输入的时候我们将其也添加到集合那么看size大小就行了
#include
#define maxn 200005
using namespace std;
typedef long long ll;
ll a[maxn];
int main(){
int n;
cin>>n;
set<ll> st;
for(int i=0;i<n;i++){
cin>>a[i];
st.insert(a[i]);
}
if(st.size() == n){
cout<<"YES"<<endl;
}
else{
cout<<"NO"<<endl;
}
return 0;
}
D题目链接在这里
题意:就是给你一组数据,然后的话你要从中选取连续的k个数,这k个数你重新置为1~~k之间的随机数,求能取到的最大的期望。
思路:我这个题目是暴力来做的,就是我将数组遍历,每次取k个数我求他们的期望,然后不断更新,最后得到答案,可惜超时了
Sample Input 1
5 3
1 2 2 4 5
Sample Output 1
7.000000000000
#include
#define maxn 200005
using namespace std;
int a[maxn];
double check(double n){
double ans = 0.0;
for(int i=1;i<=n;i++){
ans += (1.0/n)*i;
}
return ans;
}
int main(){
int n,k;
cin>>n>>k;
for(int i=0;i<n;i++){
cin>>a[i];
}
double res = -1.0;
double sum;
for(int i=0;i<n-k+1;i++){
sum = 0.0;
for(int j=i,l=1;l<=k;j++,l++){
sum += check((double)a[j]);
}
res = max(res,sum);
}
printf("%.12lf",res);
return 0;
}
AC
思路差不多吗,还是遍历求最大值,但是在求均值的时候我们可以这样想,因为本身取自1~k,所以sum就是所有的最大的值得总和,那么m就是多少个也就是1,11,1…,需要变动的最小的值得总和。所以相加除以2即可!!(相比上面,优化在这里)
#include
using namespace std;
const int N = 200000 + 10;
int n, m;
int a[N];
int mmax = -1;
int sum;
int main() {
cin >> n >> m;
for (int i = 1; i <= n; i++)
cin >> a[i];
for (int i = 1; i <= m; i++) {
sum += a[i];
}
mmax = sum;
int k = 1;
for (int i = m+1; i <= n; i++, k++) {
sum = sum - a[k] + a[i];
//cout << a[k] << " " << a[i] << endl;
mmax = max(mmax, sum);
}
double d;
d = mmax;
printf("%.12lf", (d + m) / 2);
return 0;
}
题意:只是看了看题
E题目链接
在这里插入代码片
日后再补!!!
F
#pragma region
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
typedef long long ll;
//#define rep(i, s, e) for (int(i) = (s); (i) < (e); ++(i))
#define rep(i, e) for (int(i) = 0; (i) < (e); ++(i))
#define all(x) x.begin(),x.end()
#pragma endregion
#pragma region Combination
const int MAX = 2002002;
const int MOD = 1000000007;
long long fac[MAX], finv[MAX], inv[MAX];
// テーブルを作る前処理
void COMinit()
{
fac[0] = fac[1] = 1;
finv[0] = finv[1] = 1;
inv[1] = 1;
for (int i = 2; i < MAX; i++)
{
fac[i] = fac[i - 1] * i % MOD;
inv[i] = MOD - inv[MOD%i] * (MOD / i) % MOD;
finv[i] = finv[i - 1] * inv[i] % MOD;
}
}
// 二項係数計算
long long COM(int n, int k)
{
if (n < k) return 0;
if (n < 0 || k < 0) return 0;
return fac[n] * (finv[k] * finv[n - k] % MOD) % MOD;
}
#pragma endregion
int main()
{
COMinit();
int r1, c1, r2, c2; cin >> r1 >> c1 >> r2 >> c2;
ll res = COM(r2 + c2 + 2, r2 + 1) - 1 + MOD;
res -= (COM(r1 + c2 + 1, r1) - 1);
res -= (COM(r2 + c1 + 1, c1) - 1);
res += (COM(r1 + c1, r1) - 1);
res %= MOD;
cout << res << endl;
}