NOIP2007年复赛
P1093 [NOIP2007 普及组] 奖学金
题目描述
思路:
可以用一个结构体进行排序得到答案
Code
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int n;
struct node{int id , yu , shu , ying , ans;
};
node v[335];bool cmp(node a , node b){if(a.ans == b.ans){if(a.yu == b.yu){return a.id < b.id;}else{return a.yu > b.yu;}}else{return a.ans > b.ans;}
}int main(){cin >> n;for(int i = 1; i <= n; i ++){cin >> v[i].yu >> v[i].shu >> v[i].ying;v[i].id = i;v[i].ans = v[i].ying + v[i].shu + v[i].yu;}sort(v + 1 , v + 1 + n , cmp);for(int i = 1; i <= 5; i ++){
// cout << v[i].id << " " << v[i].ans << " : " << v[i].yu << " , " << v[i].shu << " , " << v[i].ying << endl;cout << v[i].id << " " << v[i].ans << endl;}return 0;
}
P1094 [NOIP2007 普及组] 纪念品分组
题目描述
思路:
用上指针进行遍历解答
Code
#include<iostream>
#include<algorithm>
#include<climits>
using namespace std;
int w , n , sum;
int a[102457] , v[102457];bool cmp(int a , int b){return a > b;
}int main(){cin >> w >> n;for(int i = 1; i <= n; i ++)cin >> a[i];sort(a + 1 , a + 1 + n , cmp);// for(int i = 1; i <= n; i ++) cout << a[i] << " ";int i = 1 , j = n;while(i <= j){if(i != j && a[i] + a[j] <= w){i ++ , j --;sum ++;}else{i ++ , sum ++;}}cout << sum << endl;return 0;
}
P1095 [NOIP2007 普及组] 守望者的逃离
题目描述
思路:
用DP的思路进行计算得到答案后,再进行比较
Code
#include<iostream>
using namespace std;
int m , s , t;
int dp[111010101];
int main(){cin >> m >> s >> t;for(int i = 1; i <= t; i ++){if(m >= 10){dp[i] = dp[i - 1] + 60;m -= 10;}else{m += 4;dp[i] = dp[i - 1];}}for(int i = 1; i <= t; i ++){if(dp[i] < dp[i - 1] + 17) dp[i] = dp[i - 1] + 17;if(dp[i] >= s){cout << "Yes" << endl << i << endl;exit(0);}}cout << "No" << endl << dp[t] << endl;return 0;
}
P1096 [NOIP2007 普及组] Hanoi 双塔问题
题目描述
思路:
此题较难,我们可以先用一个六十分的代码来寻找一下规律。
60Code
#include<iostream>
#include<cmath>
using namespace std;
int n;
long long hanruota[205] = {0 , 1 , 3};void fib(){for(int i = 3; i <= 200; i ++){hanruota[i] = hanruota[i - 1] + pow(2 , i - 1);}
}int main(){cin >> n;fib();cout << hanruota[n] * 2;return 0;
}
// 有n个盘子
通过这个代码。嗯,可以找到一个规律就是:F(n) = 2 * F(n - 1) + 2 ,最后得到答案。
100Code
#include<iostream>
using namespace std;
int n;
int a[250];
int main(){cin >> n;a[0] = 2;for(int i = 2; i <= n; i ++){a[0] += 1;for(int j = 0; j < 200; j ++)a[j] *= 2;for(int j = 0; j < 200; j ++){a[j + 1] += a[j] / 10;a[j] %= 10;}}int p = 200;while(a[p] == 0) p --;for(int i = p; i >= 0; i --) cout << a[i];return 0;
}
创作不易,点赞收藏,谢谢
如果有错请指出谢谢给位dalao