程序设计入门竞赛

等差数列  

 难绷,掉坑里了QAQ

这道题首先要知道求等差数列的公式

然后,求d的时候不要掉进坑以为最小的差值就是公差 No!!!!要是最小数值刚好是公差两倍不就错了是吧,所以这个时候就要求各个值之间的最大公因数!!懂了吧,这才是本题解题的关键(骂自己

#include<bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10;
int a[N];
int n;
int main()
{
    cin >> n;
    for(int i = 1; i <= n; i ++ ) cin >> a[i];
    sort(a + 1, a + 1 + n);
    int d = a[2] - a[1];
    for(int i = 3; i <= n; i ++ ) d = __gcd(d, a[i] - a[i - 1]);
    if(d == 0) cout << n << endl;
    else cout << (a[n] - a[1]) / d + 1<< endl;
    return 0;
}

后缀表达式

 md巨坑一道题,一开始贪心错了,后面推把我推吐了QAQ

推导过程:

未改良版:

#include<bits/stdc++.h>
using namespace std;
#define ll long long
int a[200009]; 
int cnt;
int main(){
    int n, m;
    while(cin >> n >> m){
        int N = n + m + 1;
        ll sum = 0;
        for (int i = 0; i < N; i++) {
            cin >> a[i];
            if(a[i] < 0) cnt ++ ;
        }
        sort(a, a + N);
        if (m == 0){
            for (int i = 0; i < N; i++){
                sum += a[i];
            }
        }
        else if(cnt >= m){
            for(int i = 0; i < N; i ++ )
                sum += abs(a[i]);
        }
        else{
            for(int i = 0; i < N; i++)
                sum += abs(a[i]);
            if(cnt == 0) sum -= 2 * a[0]; 
        }
        cout << sum << endl;
    }    
    
    return 0;
}

 改良版

#include<bits/stdc++.h>
using namespace std;
#define ll long long
int a[200009]; 
int main(){
    int n, m;
    while(cin >> n >> m){
        int N = n + m + 1;
        ll sum = 0;
        for (int i = 0; i < N; i++) cin >> a[i];
        if (m == 0){
            for (int i = 0; i < n + m + 1; i++){
                sum += a[i];
            }
        }
        else{
            sort(a, a + N);
            sum = a[N - 1] - a[0];
            for (int i = 1; i < N - 1; i++)
                sum += abs(a[i]);
        }
        cout << sum << endl;
    }    
    
    return 0;
}

Amity Assessment

 思维题思维题。。。。最讨厌思维题但又比较好理解。。。

#include<bits/stdc++.h>
using namespace std;
string a, b, c, d;
string s1, s2;
int main(){
    cin >> a >> b >> c >> d;
    for(int i = 0; i < 2; i ++ ){
        if(a[i] != 'X') s1 += a[i];
    }
    for(int i = 1; i >= 0; i -- ){
        if(b[i] != 'X') s1 += b[i];
    }
    s1 += s1;
    for(int i = 0; i < 2; i ++ ){
        if(c[i] != 'X') s2 += c[i];
    }
    for(int i = 1; i >= 0; i -- ){
        if(d[i] != 'X') s2 += d[i];
    }
    if(s1.find(s2) == string :: npos) puts("NO");
    else puts("YES");
    return 0;
}

Limak and Reverse Radewoosh

 倒在了分数取值不能是负数,应该要干脆点零分QAQ

#include<bits/stdc++.h>
using namespace std;
int n, c;
const int N = 1010;
int p[N], t[N];
int main(){
    cin >> n >> c;
    for(int i = 0; i < n; i ++ ) cin >> p[i];
    for(int i = 0; i < n; i ++ ) cin >> t[i];
    int tsum1 = 0, sum1 = 0, sum2 = 0, tsum2 = 0;
    for(int i = 0; i < n; i ++ ){
        tsum1 += t[i];
        sum1 += max(0, p[i] - c * tsum1);
    }
    for(int i = n - 1; i >= 0; i -- ){
        tsum2 += t[i];
        sum2 += max(0, p[i] - c * tsum2);
    }
    if(sum1 > sum2) cout << "Limak" << endl;
    if(sum1 < sum2) cout << "Radewoosh" << endl;
    if(sum1 == sum2) cout << "Tie" << endl;

    
    return 0;
}

Limak and Displayed Friends 

set自动从小到大排序 

* 注意find函数在set中没有找到的表达

set<int> s;
if(s.find(b[j])==s.end())//b[j]不在set<int> s中
{
     s.insert(b[j]);//执行操作
}
#include<bits/stdc++.h>
using namespace std;
const int N = 150010;
int t[N], flag[N];
int n, k, q;
set<int> s;
int main(){
    cin >> n >> k >> q;
    for(int i = 1; i <= n; i ++ ) cin >> t[i];
    while(q -- ){
        int type, id;
        cin >> type >> id;
        if(type == 1){
            s.insert(t[id]);
            if(s.size() > k) s.erase(s.begin());
        }
        else if(type == 2){
            if(s.find(t[id]) == s.end()) puts("NO");
            else puts("YES");
        }
    }
}

 看病要排队

 卡住的地方:优先队列的< 、>对应的升降序是不一样的

#include <bits/stdc++.h>
using namespace std;
struct stu
{
    int priority, idx;
    bool operator < (const stu &b)const{
        if(priority == b.priority) return idx > b.idx;
        return priority < b.priority;
    }
}temp;

int main()
{
    int n;
    priority_queue<stu> q[4];
    while(scanf("%d", &n) != EOF){
        int x1, x2, t = 1;
        for(int i = 1; i <= 3; i ++ ){
            while(q[i].size()) q[i].pop();
        }
        string str;
        for(int i = 0; i < n; i ++ ){
            cin >> str;
            if(str == "IN"){
                cin >> x1 >> x2;
                temp.idx = t ++ ;
                temp.priority = x2;
                q[x1].push(temp);
            }
            else if(str == "OUT"){
                cin >> x1;
                if(q[x1].size()){
                    cout << q[x1].top().idx << endl;
                    q[x1].pop();
                }
                else cout << "EMPTY" << endl;
            }
            
        }
    }
    return 0;
}

Cupcake Bonuses 

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int maxn = 1e6 + 5;
LL base[maxn];
LL ans[maxn];
int n, num = 1;
LL s;
vector<int> vec[maxn];
void dfs(int now,LL val){
	ans[now] += base[now] * val;
	for(int i = 0; i < vec[now].size(); i ++ ){
		dfs(vec[now][i], val);
	}
}
int main(){
    cin >> n >> s;
    for(int i = 0; i < maxn; i ++ ) base[i] = s;
    memset(ans, 0, sizeof ans);
    while(n -- ){
	    LL val;
    	int op, id;
    	cin >> op;
    	if(op == 1){
    		cin >> id;
    		num ++ ;
    		vec[id].push_back(num);
		}
		else if(op == 2){
			cin >> id >> val;
			base[id] = val;
		}
		else if(op == 3){
			cin >> id >> val;
			dfs(id, val);
		}
		else if(op == 4){
			cin >> id;
			cout << ans[id] << endl;
		}
	}
    return 0;
}

免费馅饼 

#include<bits/stdc++.h>
using namespace std;
const int N=100005;
int dp[N][12];
int main()
{
	int n;
	int x,T; 
	while(scanf("%d",&n)==1&&n!=0)
	{
		memset(dp,0,sizeof(dp));
		int m=0;
		for(int i=0;i<n;i++)
		{
			scanf("%d%d",&x,&T);
			dp[T][x]++;
			m = max(m, T);
		}
		for(int i=m-1;i>=0;i--)
		for(int j=0;j<11;j++)
		{
		    if(j==0)
		        dp[i][j]+=max(dp[i+1][j],dp[i+1][j+1]);
		    else if(j==10)
		        dp[i][j]+=max(dp[i+1][j-1],dp[i+1][j]);
		    else
		        dp[i][j]+=max(dp[i+1][j-1],max(dp[i+1][j],dp[i+1][j+1]));
		}
		
		printf("%d\n",dp[0][5]);
	}
	return 0;
 } 
		

组建足球队 

#include<bits/stdc++.h>
using namespace std;
int score[201][10][10], a[201], b[201], c[20], d[20];
int main(){
	while(1){
		int j, k, s, n;
		scanf("%d", &n);
		int m1, m2, m3;
		if(n == 0) break;
		for(int i = 1; i <= n; i ++ ){
			scanf("%d %d ", &a[i], &b[i]);
		}
		for(int i = 0; i <= n; i ++ ){
			for(int j = 0; j <= 8; j ++ ){
				for(int k = 0; k <= 8; k ++ ){
					score[i][j][k] = 0;
				}
			}
		}
		score[1][1][0] = a[1];
		score[1][0][1] = b[1];
		for(int i = 2; i <= n; i ++ ){
			for(int j = 0; j <= 8 && j <=  i; j ++ ){
				for(int k = 0; k <= 8 && (j + k <= i); k ++ ){
					if(j + k == 0) continue;
					m1 = score[i - 1][j][k];
					if(j > 0) m2 = score[i - 1][j - 1][k] + a[i];
					else m2 = 0;
					if(k > 0) m3 = score[i - 1][j][k - 1] + b[i];
					else m3 = 0;
					score[i][j][k] = max(max(m1, m2), m3);
				}
			}
		}
		printf("%d\n", score[n][8][8]);
		j = k = 8; 
		s = 0;
		for(int m = n; m >= 1; m -- ){
			if(s == 16) break;
			if(score[m][j][k] != score[m - 1][j][k]){
				s ++ ;
				c[s] = m;
				if(j > 0){
					if(score[m][j][k] == score[m- 1][j - 1][k] + a[m]){
						d[s] = 1;
						j -- ;
					}
					else{
						d[s] = 2;
						k -- ;
					}
				}
				else{
					d[s] = 2;
					k -- ;
				}
			}
		}
		for(int i = 16; i >= 1; i -- ){
			printf("%d %d %d %d\n", c[i], a[c[i]], b[c[i]], d[i]);
		}
	}
}

子序列 

dp[i] [j] 表示s的前i个包含t的前j个字符所需要修改的最少字符是多少

当s[i] = t[j]时,也就是字符相同时,就代表这个字符不需要进行修改,故dp[i] [j] = dp[i - 1] [j - 1]

当s[i] != t[j]时,也就是有可能得修改,修改的话就是dp[i - 1] [j - 1] + 1, 还有可能是之前就已经包含住他了, 就是dp[i - 1] [j],所以dp[i] [j] = min(dp[i - 1] [j - 1] + 1, dp[i - 1] [j])

#include<bits/stdc++.h>
#define INF 0x3f3f3f3f
using namespace std;
typedef long long LL;
const int N = 1010;
int dp[N][N];
string s, t;
int main(){
    cin >> s >> t;
    s = " " + s;
    t = " " + t;
    memset(dp, INF, sizeof dp);
    dp[0][0] = 0;
    for(int i = 1; i <= s.size(); ++i)dp[i][0] = 0;
    for(int i = 1; i <= s.size(); ++i){
        for(int j = 1; j <= t.size(); ++j){
            if(s[i] == t[j]){
                dp[i][j] = dp[i - 1][j - 1];
            }
            else dp[i][j] = min(dp[i - 1][j - 1] + 1, dp[i - 1][j]);
        }
    }
    cout<<dp[s.size()][t.size()]<<endl;
    return 0;
}

年号字串 

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
void fun(LL n){
	if(n == 0) return;
	if(n % 26 != 0){
		fun(n / 26);
		printf("%c", n % 26 + 'A' - 1); 
	}
	else{
		fun((n - 1) / 26);
		printf("Z"); 
	}
}
int main(){
	LL num;
    while(scanf("%lld", &num) != EOF){
        fun(num);
        puts("");
    }
	return 0;
}

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值