• Codeforces Round #733


    image

    • 只要统计一下给的数字中最大的那一位十位数就是所求答案
    #include <bits/stdc++.h>
    using namespace std;
    
    void solve(){
    	int n;
    	cin >> n;
    	int maxn = -1;
    	while(n){
    		maxn = max(maxn, n % 10);
    		n /= 10;
    	}
    	cout << maxn << endl;
    }
    int main(){
    	int t;
    	cin >> t;
    	while(t --){
    		solve();
    	}
    	
    	return 0;
    }
    

    image
    image

    • 贪心 + 模拟,为了使1的数量尽可能多,需要讨论一下行和列的奇偶性
    #include <bits/stdc++.h>
    using namespace std;
    
    int maze[22][22];
    void solve(){
    	int h, w;
    	cin >> h >> w;
    	memset(maze, 0, sizeof maze);
    	if(h % 2 == 0 && w % 2 == 0){
    		for(int i = 1; i <= w; i += 2)
    			maze[1][i] = 1, maze[h][i] = 1;
    		for(int i = 3; i <= h - 2; i += 2)
    			maze[i][1] = 1, maze[i][w] = 1;
    	}else if(h % 2 == 1 && w % 2 == 1){
    		for(int i = 1; i <= w; i += 2)
    			maze[1][i] = 1, maze[h][i] = 1;
    		for(int i = 3; i <= h; i += 2)
    			maze[i][1] = 1, maze[i][w] = 1;
    	}else if(h % 2 == 0 && w % 2 == 1){
    		for(int i = 1; i <= w; i += 2)
    			maze[1][i] = 1, maze[h][i] = 1;
    		for(int i = 3; i <= h - 2; i += 2)
    			maze[i][1] = 1, maze[i][w] = 1;
    	}else if(h % 2 == 1 && w % 2 == 0){
    		for(int i = 1; i <= w; i += 2)
    			maze[1][i] = 1, maze[h][i] = 1;
    		for(int i = 3; i <= h - 2; i += 2)
    			maze[i][1] = 1, maze[i][w] = 1;
    	}
    	for(int i = 1; i <= h; i ++){
    		for(int j = 1; j <= w; j ++)
    			cout << maze[i][j];
    		cout << endl;
    	}
    }
    int main(){
    	int t;
    	cin >> t;
    	while(t --){
    		solve();
    	}
    	
    	return 0;
    }
    

    image
    image

    • 一道思维 + 贪心题目,很有意思,重点是在贪心过程中不断更新和弹出需要进来的那个值,对于A来说,为了使他尽可能胜利,那么每次进来新的值为100则为最优,并且弹出去的是之前进入的最小的那个,对于B,每次都给他放入一个0,这样能保证差距最大,速度也最快。
      可恶的是当时队列没在函数里更新,导致一直WA在第二个样例
    #include <bits/stdc++.h>
    using namespace std;
    
    const int N = 1e5 + 10;
    int a[N], b[N];
    
    int cnt;
    void solve(){
    	priority_queue<int> p11, p22;
    	int n;
    	cin >> n;
    	for(int i = 1; i <= n; i ++){
    		int x;
    		cin >> x;
    		p11.push(x);
    		a[i] = x;
    	}
    	for(int i = 1; i <= n; i ++){
    		int x;
    		cin >> x;
    		p22.push(x);
    		b[i] = x;
    	}
    	sort(a + 1, a + 1 + n, greater<int>());
    	sort(b + 1, b + 1 + n, greater<int>());
    	int sum1 = 0, sum2 = 0;
    	for(int i = 1; i <= n - n / 4; i ++){
    		int t = p11.top();
    		p11.pop();
    		sum1 += t;
    		t = p22.top();
    		p22.pop();
    		sum2 += t;
    	}
    	if(sum1 >= sum2){
    		cout << 0 << endl;
    		return;
    	}
    	int ans = 0;
    	int flag = n - n / 4;
    	while(sum1 < sum2){
    		++ ans;
    		if((n + ans) % 4 == 0){
    			if(flag){
    				sum1 -= a[flag];
    				flag --;
    				sum1 += 100;
    			}else
    				sum1 += 100;
    		}else{
    			sum1 += 100;
    		}
    		
    		if(p22.size()){
    			if((n + ans) % 4 == 0){
    				sum2 += 0;
    			}else{
    				sum2 += p22.top();
    				p22.pop();
    			}
    		}else
    			sum2 += 0;
    	}
    		cout << ans << endl;
    }
    int main(){
    	int t;
    	cin >> t;
    	while(t --){
    		cnt ++;
    		solve();
    	}
    	
    	return 0;
    }
    

    image
    image

    • 一道图论题
      关键在于如何处理那些没人爱和有花给不了的人,对于这些人,肯定最后要将他们进行匹配的,而那些先下手的是名正言顺的,暂时不用管。
      到了最后肯定会有某个点等于自身,这个可以进行证明。此处略。
      而对于这个等于自身的点,只需要让他送给他原来想送的那个人,而将送给他梦中情人的那个情敌送给他,这样就拐过来了,并且不会出现矛盾。
      另外,需要注意的是,数组的大小一定要是指定的大小,而不是最大值!!!!!!
    #include <bits/stdc++.h>
    using namespace std;
    
    const int N = 2e5 + 10;
    
    void solve(){
    	int n, cnt = 0;
    	vector<int> vec1, vec2;
    	scanf("%d", &n);
    	int a[n + 1], source[n + 1], ans[n + 1];
    	memset(ans, 0, sizeof ans);
    	memset(source, 0, sizeof ans);
    	for(int i = 1; i <= n; i ++){
    		scanf("%d", &a[i]);
    		if(!source[a[i]]){
    			cnt ++;
    			source[a[i]] = i;
    			ans[i] = a[i];
    		}else{
    			vec1.push_back(i);
    		}
    	}
    	for(int i = 1; i <= n; i ++){
    		if(source[i] == 0)
    			vec2.push_back(i);
    	}
    	for(int i = 0; i < vec1.size(); i ++)
    		ans[vec1[i]] = vec2[i];
    	for(int i = 1; i <= n; i ++){
    		if(ans[i] == i){
    			ans[i] = a[i];
    			int s = source[a[i]];
    			ans[s] = i;
    			source[a[i]] = i;
    		}
    	}
    	printf("%d
    ", cnt);
    	for(int i = 1; i <= n; i ++)
    		printf("%d ", ans[i]);
    	printf("
    ");
    }
    int main(){
    	int t;
    	scanf("%d", &t);
    	while(t --){
    		solve();
    	}
    	
    	return 0; 
    }
    
  • 相关阅读:
    “奇葩”控件向后台传数据
    借助cookie实现子网页修改父网页内容遇到的问题:同一个浏览器访问相同页面,会互相影响。 (已解决)
    JS 怎么控制某个div的滚动条滚动到顶部? (已解决)
    怎么在表单提交前检查数据输入。
    table布局, td内部元素溢出边界问题。 (已解决)
    怎么在两个内嵌的子网页之间通信?(已解决)
    关于div的滚动条滚动到底部,内容显示不全的问题。(已解决)
    怎么使用CKEDITOR
    新问题:关于网页中的文本框在手机上受软键盘弹出的影响问题。(已解决)
    Oracle多行查询(函数)
  • 原文地址:https://www.cnblogs.com/pureayu/p/15032988.html
Copyright © 2020-2023  润新知