AtCoder Beginner Contest 154


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を使いたいので、私は2つ開いて、stringが一致する時mapの値は増加しませんが、一致しない値は、1をプラスします.これでACができるなんて、強情だよ!!mapを使って、1つのサインを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リンク题意:あなたに1组のデータをあげた后に、中に重複するデータがあるかどうかを闻いて、无ければYESを出力して、さもなくばNOを出力します!
構想:最初は複雑すぎて、配列を開くことを考えて、それから入力する時にそれを処理して、一度現れたことがあるならば私はその位置に1を加えて、しかしこのように配列を開くのはとても浪費して、空間を占有して大きくて、ここにはまだ1 e 9まで循環すると、コンパイルは成功しません.だから私はテスト時にそれを縮小して実行することができて、疑問???
#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;
}